Почему UnhandledExceptionEventArgs.ExceptionObject является объектом, а не исключением?

126

Почему UnhandledExceptionEventArgs.ExceptionObjectобъект, а не объект Exception?

Я прикрепляюсь к AppDomain.UnhandledException.

Я хотел бы, чтобы бросить UnhandledExceptionEventArgs.ExceptionObjectна Exceptionи interogate его.

И с учетом этого будет ли оно когда-нибудь нулевым?

Документация MSDN не особо полезна.

Получает объект необработанного исключения.

Саймон
источник

Ответы:

148

Это нельзя ввести как Exception, потому что в .Net можно создавать объекты, которые не являются производными от System.Exception. Это невозможно в C # или VB.Net, но возможно на других языках, основанных на CLR. Следовательно, API должен поддерживать эту возможность и использовать объект типа.

Таким образом, хотя он никогда не должен быть нулевым, на самом деле это может не быть System.Exception.

См. Раздел 10.5 спецификации CLI (в частности, правило 40 CLS) для получения более подробной информации.

JaredPar
источник
3
Спасибо, Джаред, я добавил ваш ответ и ссылку на материалы сообщества msdn
Саймон
Значит, преобразование его в Exception в C # не будет проблемой? право?
Mubashar
1
@MubasharAhmad это может быть проблемой, если тип не является производным от System.Exception. Исключение могло произойти из-за несовместимого с CLI языка, который решил выбросить файл System.Int32. В новых версиях CLR это будет автоматически, System.Exceptionно это параметр, который можно отключить
JaredPar
1
@MubasharAhmad Я бы порекомендовал вам использовать приведение as, чтобы в случае, если объект не является производным от типа Exception, приведение по умолчанию принимало значение null, а не создавало исключение.
david.barkhuizen
Почему тогда try-catchблок не позволяет отлавливать объекты, не являющиеся исключениями?
AgentFire
79

В дополнение к тому, что уже упомянул Джаред, вы можете безопасно выполнить приведение Exceptionв .NET Framework 2.0 и выше, если RuntimeCompatibilityAttribute(WrapNonExceptionThrows=true)оно было применено к вашей сборке (будет добавлено автоматически компиляторами C # и VB).

Когда этот атрибут был применен, «исключения», не являющиеся исключениями, будут заключены в оболочку RuntimeWrappedException.

Николь Калиною
источник
3
Спасибо за информацию; Я обрабатывал это вручную, т. Е. Заключал в RuntimeWrappedException, если не удалось создать исключение.
Деннис