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é.

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


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.


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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.