WPF全局未处理异常捕获

事件订阅

1
System.Windows.Application.DispatcherUnhandledException += Application_DispatcherUnhandledException;

Application_DispatcherUnhandledException方法

1
2
3
4
private void Application_DispatcherUnhandledException(object sender, System.Windows.Threading.DispatcherUnhandledExceptionEventArgs e)
{
ProMessageUtils.ShowDialog($"捕获未处理异常:{e.Exception.Message}\r\n{e.Exception.StackTrace}", "错误", System.Windows.MessageBoxButton.OK, System.Windows.MessageBoxImage.Error);
}

注解

默认情况下,Windows Presentation Foundation捕获未经处理的异常,从对话框 (通知用户异常,用户可以从该对话框中报告异常) ,并自动关闭应用程序。

但是,如果应用程序需要从集中位置执行自定义未经处理的异常处理,则应处理 DispatcherUnhandledException

DispatcherUnhandledExceptionApplication 针对主 UI 线程上运行的代码未处理的每个异常引发。

如果在后台 UI 线程 (具有其自己的 Dispatcher) 的线程或后台工作线程 (没有 Dispatcher) 的线程上处理异常,则异常不会转发到主 UI 线程。 因此, DispatcherUnhandledException 不会引发 。 在这些情况下,需要编写代码来执行以下操作:

  1. 处理后台线程上的异常。
  2. 将这些异常调度到主 UI 线程。
  3. 在主 UI 线程上重新引发它们,而无需处理它们以允许 DispatcherUnhandledException 引发。

有关详细信息,请参阅 线程模型 概述。

DispatcherUnhandledException 事件处理程序传递一个 DispatcherUnhandledExceptionEventArgs 参数,其中包含有关异常的上下文信息,包括:

可以使用此信息来确定异常是否可恢复。 例如,可恢复异常可能是 , FileNotFoundException而不可恢复的异常可能是 StackOverflowException,例如。

处理来自 DispatcherUnhandledException的未经处理的异常并且不希望 WPF 继续处理它时,需要将 属性设置为 Handledtrue

与其他引发的事件 Application 不同, DispatcherUnhandledException 没有匹配的受保护虚拟实现 (OnDispatcherUnhandledException) 。 因此,派生自 Application 的类必须始终向 DispatcherUnhandledException 注册事件处理程序,才能处理未经处理的异常。


[官方文档]:Application.DispatcherUnhandledException 事件 (System.Windows) | Microsoft Learn