Dlaczego UnhandledExceptionEventArgs.ExceptionObject jest obiektem, a nie wyjątkiem?

126

Dlaczego jest UnhandledExceptionEventArgs.ExceptionObjectprzedmiotem, a nie Exception?

Przywiązuję się do AppDomain.UnhandledException.

Chciałbym oddanych UnhandledExceptionEventArgs.ExceptionObjectdo Exceptioni interogate go.

Mając to na uwadze, czy kiedykolwiek będzie to zerowe?

Dokumentacja MSDN nie jest specjalnie przydatna.

Pobiera nieobsługiwany obiekt wyjątku.

Szymon
źródło

Odpowiedzi:

148

Nie można tego wpisać w Exception, ponieważ możliwe jest wrzucanie obiektów w .Net, które nie pochodzą od System.Exception. Nie jest to możliwe w C # lub VB.Net, ale jest możliwe w innych językach opartych na CLR. Stąd API musi obsługiwać tę możliwość i używać obiektu typu.

Więc chociaż nigdy nie powinien być pusty, w rzeczywistości może nie być Wyjątkiem System.Exception.

Więcej informacji można znaleźć w specyfikacji CLI w sekcji 10.5 (szczególnie w regule 40 CLS)

JaredPar
źródło
3
Dzięki, Jared, dodałem Twoją odpowiedź i łącze z powrotem do treści społeczności msdn
Simon
Więc rzutowanie go do wyjątku w C # nie będzie problemem? dobrze?
Mubashar
1
@MubasharAhmad może to być problem, jeśli typ nie jest pochodną System.Exception. Wyjątek mógł wynikać z języka niezgodnego z CLI, który zdecydował się na zgłoszenie System.Int32. Nowsze wersje CLR i tak będą to automatycznie zawijać, System.Exceptionale jest to ustawienie, które można wyłączyć
JaredPar
1
@MubasharAhmad Zalecałbym użycie rzutowania „as”, aby w przypadku, gdy obiekt nie pochodzi z typu Exception, rzutowanie domyślnie miało wartość null, zamiast rzucać wyjątek.
david.barkhuizen
Dlaczego więc try-catchblok nie pozwala na przechwytywanie obiektów niebędących wyjątkami?
AgentFire
79

Oprócz tego, o czym już wspomniał Jared, możesz bezpiecznie rzutować Exceptionw .NET Framework 2.0 i nowszym, jeśli RuntimeCompatibilityAttribute(WrapNonExceptionThrows=true)został zastosowany do twojego zestawu (zostanie dodany automatycznie przez kompilatory C # i VB).

Po zastosowaniu tego atrybutu „wyjątki” niebędące wyjątkami zostaną opakowane RuntimeWrappedException.

Nicole Calinoiu
źródło
3
Dziękuję za informację; Obsługiwałem to ręcznie, tj. Opakowałem go w RuntimeWrappedException, jeśli nie udało się rzucić wyjątku.
Dennis,