Pourquoi UnhandledExceptionEventArgs.ExceptionObject est-il un objet et non une exception?

126

Pourquoi UnhandledExceptionEventArgs.ExceptionObjectun objet et non un Exception?

Je m'attache à AppDomain.UnhandledException.

Je voudrais lancer UnhandledExceptionEventArgs.ExceptionObjectun Exceptionet l'interroger.

Et avec cela à l'esprit, sera-t-il jamais nul?

La documentation MSDN n'est pas vraiment utile.

Obtient l'objet d'exception non géré.

Simon
la source

Réponses:

148

Cela ne peut pas être tapé sur Exception car il est possible de lancer des objets dans .Net qui ne dérivent pas de System.Exception. Ce n'est pas possible en C # ou VB.Net, mais c'est possible dans d'autres langages basés sur CLR. Par conséquent, l'API doit prendre en charge cette possibilité et utilise l'objet type.

Ainsi, même s'il ne devrait jamais être nul, il se peut qu'il ne s'agisse pas d'une exception System.Exception.

Voir la section 10.5 des spécifications CLI (en particulier la règle CLS 40) pour plus de détails

JaredPar
la source
3
Merci Jared J'ai ajouté votre réponse et un lien vers le contenu de la communauté msdn
Simon
Donc, le convertir en Exception en C # ne sera pas un problème? droite?
Mubashar
1
@MubasharAhmad cela peut être un problème si le type n'est pas dérivé de System.Exception. L'exception pourrait provenir d'un langage non compatible CLI qui décide de lancer un fichier System.Int32. Les versions plus récentes du CLR encapsuleront automatiquement cela de System.Exceptiontoute façon, mais c'est un paramètre qui peut être désactivé
JaredPar
1
@MubasharAhmad Je vous recommande d'utiliser le cast 'as', de sorte que dans le cas où l'objet n'est pas dérivé du type Exception, le cast par défaut est nul, plutôt que de lancer une exception.
david.barkhuizen
Pourquoi alors try-catchbloquer ne permet pas d'attraper des objets non-exception?
AgentFire
79

En plus de ce que Jared a déjà mentionné, vous pouvez effectuer un cast en toute sécurité Exceptiondans .NET Framework 2.0 et supérieur s'il RuntimeCompatibilityAttribute(WrapNonExceptionThrows=true)a été appliqué à votre assembly (sera ajouté automatiquement par les compilateurs C # et VB).

Lorsque cet attribut a été appliqué, les "exceptions" sans exception seront encapsulées RuntimeWrappedException.

Nicole Calinoiu
la source
3
Merci pour l'information; Je manipulais cela manuellement, c'est-à-dire, je l'ai enveloppé dans une RuntimeWrappedException s'il échouait à lancer une exception.
Dennis