Чому UnhandledExceptionEventArgs.ExceptionObject є об’єктом, а не винятком?


126

Чому UnhandledExceptionEventArgs.ExceptionObjectоб’єкт, а не анкет Exception?

Я долучаюсь до AppDomain.UnhandledException.

Я хотів би UnhandledExceptionEventArgs.ExceptionObjectпередати його Exceptionта інтерогатизувати його.

І зважаючи на це, чи буде це колись нульовим?

Документація MSDN не дуже корисна.

Отримує необроблений об'єкт виключення.

Відповіді:


148

Це не можна набрати у виняток, оскільки можна кидати об'єкти в .Net, які не походять від System.Exception. Це неможливо в C # або VB.Net, але це можливо в інших мовах на основі CLR. Отже, API повинен підтримувати цю можливість і використовує об'єкт типу.

Тому, хоча він ніколи не повинен бути нульовим, він насправді може бути не System.Exception.

Детальнішу інформацію див. У розділі 10.5 CLI (зокрема, правило CLS 40)


3
Дякую, Джаред. Я додав тут свою відповідь та посилання на вміст спільноти msdn
Саймон

Тож відкидання його до винятку в C # не буде проблемою? правильно?
Мубашар

1
@MubasharAhmad це може бути проблемою, якщо тип не походить від System.Exception. Виняток міг стати результатом мови, сумісної з CLI, яка вирішила викинути System.Int32. Новіші версії CLR автоматично перезаписують це, System.Exceptionале це налаштування, яке можна вимкнути
JaredPar

1
@MubasharAhmad я рекомендував би використовувати команду "as", щоб у випадку, якщо об'єкт не походить від типу "Виняток", "cast" за замовчуванням нульовий, а не кидати виключення.
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.