【问题标题】:Why is UnhandledExceptionEventArgs.ExceptionObject an object and not an Exception?为什么 UnhandledExceptionEventArgs.ExceptionObject 是对象而不是异常?
【发布时间】:2010-10-29 03:31:55
【问题描述】:

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

我正在附加到AppDomain.UnhandledException

我想将UnhandledExceptionEventArgs.ExceptionObject 转换为Exception 并询问它。

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

MSDN documentation 不是特别有用。

获取未处理的异常对象。

【问题讨论】:

    标签: .net exception exception-handling unhandled-exception


    【解决方案1】:

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

    因此,虽然它不应该为 null,但实际上它可能不是 System.Exception。

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

    【讨论】:

    • 谢谢 Jared,我已在此处添加了您的答案和指向 msdn 社区内容的链接
    • 那么在 C# 中将其转换为 Exception 不会有问题吗?对吗?
    • @MubasharAhmad 如果类型不是从System.Exception 派生的,则可能会出现问题。异常可能是由不符合 CLI 的语言导致的,该语言决定抛出 System.Int32。无论如何,较新版本的 CLR 将自动将其包装在 System.Exception 中,但这是一个可以禁用的设置
    • @MubasharAhmad 我建议您使用“as”强制转换,以便在对象不是从 Exception 类型派生的情况下,强制转换默认为 null,而不是引发异常。
    • 为什么try-catch 块不允许捕获非异常对象?
    【解决方案2】:

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

    应用此属性后,非异常“异常”将被包裹在RuntimeWrappedException 中。

    【讨论】:

    • 感谢您提供的信息;我是手动处理的,也就是说,如果它未能抛出异常,则将其包装在 RuntimeWrappedException 中。
    猜你喜欢
    • 1970-01-01
    • 2011-02-22
    • 2012-10-25
    • 1970-01-01
    • 1970-01-01
    • 2011-11-17
    • 2019-11-20
    • 1970-01-01
    相关资源
    最近更新 更多