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

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

Присоединяюсь к AppDomain.UnhandledException.

Я хотел бы преобразовать UnhandledExceptionEventArgs.ExceptionObject в Exception и перебросить его.

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

документация MSDN не очень полезна.

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


person Simon    schedule 27.05.2009    source источник


Ответы (2)


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

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

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

person JaredPar    schedule 27.05.2009
comment
Спасибо, Джаред, я добавил ваш ответ и ссылку на материалы сообщества msdn. - person Simon; 27.05.2009
comment
Значит, преобразование его в Exception в C # не будет проблемой? правильно? - person Mubashar; 28.11.2013
comment
@MubasharAhmad, это может быть проблемой, если тип не является производным от System.Exception. Исключение могло произойти из-за несовместимого с CLI языка, который решил выбросить System.Int32. Более новые версии CLR в любом случае автоматически обернут это в System.Exception, но это параметр, который можно отключить. - person JaredPar; 30.11.2013
comment
@MubasharAhmad Я бы порекомендовал вам использовать приведение "as", чтобы в случае, если объект не является производным от типа Exception, приведение по умолчанию было равно null, а не генерировало исключение. - person david.barkhuizen; 12.09.2016
comment
Почему тогда блок try-catch не позволяет отлавливать объекты, не являющиеся исключениями? - person AgentFire; 16.06.2017
comment
@AgentFire, потому что, как сказал JaredPar, C # не поддерживает исключения, которые не являются производными от Exception. Платформа .NET и среда выполнения .NET работают, а язык C # - нет. - person Sören Kuklau; 07.12.2017

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

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

person Nicole Calinoiu    schedule 17.09.2009
comment
Спасибо за информацию; Я обрабатывал это вручную, то есть заключал в исключение RuntimeWrappedException, если не удалось создать исключение. - person Dennis; 21.07.2011