AppDomain.UnhandledException会自动重新抛出已处理的异常

时间:2013-02-02 18:44:22

标签: c# wpf exception exception-handling

我正在尝试捕获我的应用程序中的所有未处理的异常,以便有条件地处理那些可以在不终止应用程序的情况下,但我无法解决一个非常基本的问题:它不会停止异常。在代码中的某处抛出未处理的异常,它出现在此处,显示消息框,然后应用程序显示相同的异常未处理(如果处于调试模式)或只是崩溃(如果没有调试运行)。意味着即使调用了处理程序,异常仍然未处理。

App() {
    AppDomain.CurrentDomain.UnhandledException += (s, a) => {
        var ex = (Exception)a.ExceptionObject;
        MessageBox.Show(ex.Message, "Error", MessageBoxButton.OK, MessageBoxImage.Error);
    };
}

这是来自一个新的空白测试项目,其中没有任何内容,但此代码和单击时抛出异常的按钮。

5 个答案:

答案 0 :(得分:3)

您忘了终止您的计划。因此,它继续正常的未处理异常处理。添加以下行:

  Environment.Exit(System.Runtime.InteropServices.Marshal.GetHRForException(ex));

稍微费力的Marshal调用确保为您的进程获取Process.ExitCode的另一个进程获得合理的错误指示。它是可选的,仅建议使用。

答案 1 :(得分:0)

不应该“停止”异常,即行为is by design

  

此事件提供未捕获异常的通知。它允许应用程序在系统默认处理程序向用户报告异常并终止应用程序之前记录有关异常的信息。

考虑到这个地方是没有其他人不愿意处理有问题的例外,除了记录和死亡之外没有任何明智的事情要做。

您应该处理那些应该将应用程序更接近它们发生的位置的异常处理。

答案 2 :(得分:0)

如果这确实是您想要的行为,可以将以下内容添加到应用程序配置文件中:

<legacyUnhandledExceptionPolicy enabled="1"/>

请参阅Exceptions in Managed Threads

答案 3 :(得分:0)

From MSDN:

  

此事件提供未捕获异常的通知。它允许应用程序在系统默认处理程序向用户报告异常并终止应用程序之前记录有关异常的信息。如果有足够的有关应用程序状态的信息,则可以采取其他措施 - 例如保存程序数据以便以后恢复。建议小心,因为在未处理异常时程序数据可能会损坏。

换句话说,它只是一个处理程序,允许您告诉用户发生了什么,如果您需要能够恢复数据,则生成最后一分钟的保存信息,或执行诸如触发自定义错误报告之类的操作。 它不是一个捕获块。要捕获异常,您必须使用Try-Catch。

答案 4 :(得分:0)

您实际上并未捕获未处理的异常,而只是处理在终止应用程序之前发生的事件(在发布模式下)。订阅此事件并不算是捕获已经未处理的异常。

来自MSDN: 此事件提供未捕获异常的通知。它允许应用程序在系统默认处理程序向用户报告异常并终止应用程序之前记录有关异常的信息。如果有足够的有关应用程序状态的信息,则可以采取其他措施 - 例如保存程序数据以便以后恢复。建议小心,因为在未处理异常时程序数据可能会损坏。