为什么UnhandedExceptionEventArgs.ExceptionObject是一个对象而不是一个异常?

134
为什么UnhandledExceptionEventArgs.ExceptionObject是一个对象而不是Exception
我正在附加到AppDomain.UnhandledException
我想将UnhandledExceptionEventArgs.ExceptionObject强制转换为Exception并且进行询问。
考虑到这一点,它会为空吗? MSDN文档并不是非常有用。

获取未处理异常对象。

2个回答

155

这不能被类型化为 Exception,因为在 .Net 中可能会抛出不派生自 System.Exception 的对象。虽然在 C# 或 VB.Net 中不可能发生这种情况,但在其他基于 CLR 的语言中是可能的。因此,API 必须支持此可能性并使用 type object。

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

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


3
谢谢Jared,我已经将你的回答和指向这里MSDN社区内容的链接添加了进去。 - Simon
将其转换为C#中的异常类型,这样做不会有问题,对吧? - Mubashar
2
@MubasharAhmad 如果该类型不是派生自System.Exception,那么这可能是个问题。异常可能来自于非CLI兼容的编程语言,该语言决定抛出一个System.Int32。CLR的新版本将自动将其包装在System.Exception中,但这是可以禁用的设置。 - JaredPar
1
@MubasharAhmad 我建议您使用 'as' 转换,这样如果对象不是从 Exception 类型派生的话,转换将默认为 null,而不是抛出异常。 - david.barkhuizen
为什么 try-catch 块不允许捕获非 Exception 对象? - AgentFire
@AgentFire 因为,正如JaredPar所说,C#不支持不派生自Exception的异常。.NET框架和.NET运行时支持,但C#语言不支持。 - Sören Kuklau

83
除了Jared已经提到的内容外,如果RuntimeCompatibilityAttribute (WrapNonExceptionThrows = true)已应用于您的程序集(将由C#和VB编译器自动添加),则您可以在.NET Framework 2.0及更高版本中安全地转换为 Exception
当应用了此属性时,非“异常”异常将被包装在 RuntimeWrappedException 中。

3
感谢提供这个信息;我之前是手动处理的,也就是说,如果无法将异常转换成功,我会将其包装在一个RuntimeWrappedException中。 - Dennis

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接