Warum ist UnhandledExceptionEventArgs.ExceptionObject ein Objekt und keine Ausnahme?

125

Warum ist UnhandledExceptionEventArgs.ExceptionObjectein Objekt und kein Exception?

Ich hänge an AppDomain.UnhandledException.

Ich würde gerne UnhandledExceptionEventArgs.ExceptionObjecteinen Exceptionbesetzen und ihn befragen.

Und in diesem Sinne wird es jemals null sein?

Die MSDN-Dokumentation ist nicht besonders nützlich.

Ruft das nicht behandelte Ausnahmeobjekt ab.

Simon
quelle

Antworten:

147

Dies kann nicht in Exception eingegeben werden, da Objekte in .Net geworfen werden können, die nicht von System.Exception abgeleitet sind. Dies ist in C # oder VB.Net nicht möglich, aber in anderen CLR-basierten Sprachen. Daher muss die API diese Möglichkeit unterstützen und das Typobjekt verwenden.

Obwohl es niemals null sein sollte, ist es möglicherweise keine System.Exception.

Weitere Informationen finden Sie in Abschnitt 10.5 der CLI-Spezifikation (insbesondere in CLS-Regel 40)

JaredPar
quelle
3
Danke Jared Ich habe deine Antwort und einen Link hierher zum Inhalt der MSDN-Community hinzugefügt
Simon
Es wird also kein Problem sein, es in C # auf Exception zu setzen? richtig?
Mubashar
1
@MubasharAhmad kann es ein Problem sein, wenn der Typ nicht von abgeleitet ist System.Exception. Die Ausnahme könnte auf eine nicht CLI-kompatible Sprache zurückzuführen sein, die sich entscheidet, a zu werfen System.Int32. Neuere Versionen der CLR werden dies System.Exceptionsowieso automatisch umbrechen, aber dies ist eine Einstellung, die deaktiviert werden kann
JaredPar
1
@MubasharAhmad Ich würde empfehlen, dass Sie die Umwandlung 'as' verwenden, damit für den Fall, dass das Objekt nicht vom Typ Exception abgeleitet ist, die Umwandlung standardmäßig null ist, anstatt eine Ausnahme auszulösen.
David.Barkhuizen
Warum try-catcherlaubt Block dann nicht, Nicht-Ausnahme-Objekte abzufangen?
AgentFire
78

Zusätzlich zu dem, was Jared bereits erwähnt hat, können Sie sicher Exceptionin .NET Framework 2.0 und höher umwandeln, wenn RuntimeCompatibilityAttribute(WrapNonExceptionThrows=true)es auf Ihre Assembly angewendet wurde (wird automatisch von den C # - und VB-Compilern hinzugefügt).

Wenn dieses Attribut angewendet wurde, werden "Ausnahmen", die keine Ausnahmen sind, eingeschlossen RuntimeWrappedException.

Nicole Calinoiu
quelle
3
Danke für die Information; Ich habe dies manuell behandelt, dh in eine RuntimeWrappedException eingeschlossen, wenn keine Ausnahme ausgelöst werden konnte.
Dennis