Perché UnhandledExceptionEventArgs.ExceptionObject è un oggetto e non un'eccezione?


125

Perché UnhandledExceptionEventArgs.ExceptionObjectun oggetto e non un Exception?

Mi sto attaccando a AppDomain.UnhandledException.

Vorrei getto UnhandledExceptionEventArgs.ExceptionObjectad una Exceptione interogate esso.

E con questo in mente sarà mai nullo?

La documentazione MSDN non è estremamente utile.

Ottiene l'oggetto eccezione non gestita.

Risposte:


147

Questo non può essere digitato in Exception perché è possibile inserire oggetti in .Net che non derivano da System.Exception. Questo non è possibile in C # o VB.Net ma è possibile in altri linguaggi basati su CLR. Quindi l'API deve supportare questa possibilità e utilizza l'oggetto type.

Quindi, anche se non dovrebbe mai essere nullo, in realtà potrebbe non essere un System.Exception.

Vedere la sezione 10.5 delle specifiche CLI (in particolare la regola 40 CLS) per maggiori dettagli


3
Grazie Jared ho aggiunto la tua risposta e un link qui al contenuto della community msdn
Simon,

Quindi lanciarlo su Exception in C # non sarà un problema? giusto?
Mubashar,

1
@MubasharAhmad può essere un problema se il tipo non è derivato System.Exception. L'eccezione potrebbe essere derivata da un linguaggio non conforme alla CLI che decide di lanciare un System.Int32. Le versioni più recenti del CLR eseguiranno comunque automaticamente il wrapping, System.Exceptionma questa è un'impostazione che può essere disabilitata
JaredPar,

1
@MubasharAhmad Consiglierei di usare il cast 'as', in modo che, nel caso in cui l'oggetto non sia derivato dal tipo Exception, il cast sia impostato su null, anziché generare un'eccezione.
david.barkhuizen,

Perché allora il try-catchblocco non consente di catturare oggetti non di eccezione?
AgentFire,

78

Oltre a ciò che Jared ha già menzionato, puoi tranquillamente eseguire il cast Exceptionin .NET Framework 2.0 e versioni successive seRuntimeCompatibilityAttribute(WrapNonExceptionThrows=true) è stato applicato al tuo assembly (verrà aggiunto automaticamente dai compilatori C # e VB).

Una volta applicato questo attributo, verranno inserite le "eccezioni" non di eccezione RuntimeWrappedException.


3
Grazie per l'informazione; Lo stavo gestendo manualmente, vale a dire, lo avvolgevo in una RuntimeWrappedException se non riusciva a lanciare un'eccezione.
Dennis,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.