Почему 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) для получения более подробной информации.


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, если не удалось создать исключение.
Деннис
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.