为什么UnhandledExceptionEventArgs.Exception仅在首次访问时返回有用信息?

时间:2016-06-30 15:44:18

标签: uwp unhandled-exception

App.UnhandledException 中访问e.Exception时第一次按预期返回消息和堆栈跟踪。当再次访问它时,它只返回消息"类型' System.Exception'的异常。被扔了。"

这是一个错误还是这里发生了什么?

示例:

Private Sub App_UnhandledException(sender As Object, e As UnhandledExceptionEventArgs) Handles Me.UnhandledException
  Dim ex1 = e.Exception
  Debug.WriteLine($"ex1={ex1}")
  Dim ex2 = e.Exception
  Debug.WriteLine($"ex2={ex2}")
End Sub

抛出新的MyCustomException($"测试应用程序崩溃。")会导致:

ex1=ErrorHandlingDemo.MyCustomException: Testing app crash. 
   at ErrorHandlingDemo.MainPage.btnForceUnhandledEx_Click(Object sender, RoutedEventArgs e)
   at Windows.ApplicationModel.Core.UnhandledError.Propagate()
   at ...

ex2=System.Exception: Exception of type 'System.Exception' was thrown.

我知道e.Message确实保留了原始消息(并且在调试中构建了堆栈跟踪的一部分)。 e.Exception的行为仍然在第一次访问时返回有价值的信息似乎很奇怪。

作为一种解决方法,我首先将其分配给局部变量,然后再使用它。

Dim ex = e.Exception
Trace(ex)
If Typeof(ex) is MyCustomException
...

即使使用这种解决方法,也必须要小心:在赋值之前设置断点(这会导致调试器访问e.Exception)会破坏原始值。

请参阅sample code.

1 个答案:

答案 0 :(得分:2)

这是一个非常令人困惑的行为,特别是因为即使只设置断点也会破坏UnhandledExceptionEventArgs.Exception的原始值。 MS应该更改此行为或至少记录它。

通过将ex.Exception分配给局部变量的解决方法,可以使用以下异常详细信息: Unhandled exception infos debug vs release mode

有关在UWP-Apps中处理意外异常的进一步想法,我的博文Global Error Handling for UWP-Apps可能会有所帮助。