为什么UnhandledExceptionEventEventArgs.ExceptionObject是对象而不是Exception?


125

为什么是UnhandledExceptionEventArgs.ExceptionObject对象而不是对象Exception

我很喜欢AppDomain.UnhandledException

我想投射UnhandledExceptionEventArgs.ExceptionObject到一个Exception并进行询问。

考虑到这一点,它将永远为空吗?

MSDN文档不exatly有用。

获取未处理的异常对象。

Answers:


147

不能将其键入Exception,因为有可能在.Net中抛出不是从System.Exception派生的对象。这在C#或VB.Net中是不可能的,但是在其他基于CLR的语言中是可能的。因此,API必须支持这种可能性并使用类型对象。

因此,尽管它永远不应该为null,但实际上可能不是System.Exception。

有关更多详细信息,请参见CLI规范第10.5节(特别是CLS规则40)


3
谢谢贾里德(Jared),我已经添加了您的答案,并且返回了指向msdn社区内容的链接
西蒙(Simon)在2009年

因此,将其转换为C#中的Exception不会有问题吗?对?
Mubashar

1
@MubasharAhmad如果类型不是从派生的,可能会出现问题System.Exception。异常可能是由于不符合CLI的语言决定抛出System.Int32System.Exception无论如何,较新版本的CLR都会自动换行,但这是可以禁用的设置
JaredPar

1
@MubasharAhmad我建议您使用'as'强制转换,以便在对象不是从Exception类型派生的情况下,强制转换默认为null,而不是引发异常。
david.barkhuizen

为什么然后try-catchblock不允许捕获非Exception对象?
AgentFire

78

除了Jared已经提到的内容之外,Exception如果RuntimeCompatibilityAttribute(WrapNonExceptionThrows=true)已将其应用于程序集(将由C#和VB编译器自动添加),则可以在.NET Framework 2.0及更高版本中安全地进行强制转换。

应用此属性后,将包装非Exception“ exceptions” RuntimeWrappedException


3
感谢您的信息; 我正在手动处理此问题,即,如果未能抛出异常,则将其包装在RuntimeWrappedException中。
丹尼斯,
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.