WPF全局未处理异常捕获
WPF全局未处理异常捕获
事件订阅
1 | System.Windows.Application.DispatcherUnhandledException += Application_DispatcherUnhandledException; |
Application_DispatcherUnhandledException方法
1 | private void Application_DispatcherUnhandledException(object sender, System.Windows.Threading.DispatcherUnhandledExceptionEventArgs e) |
注解
默认情况下,Windows Presentation Foundation捕获未经处理的异常,从对话框 (通知用户异常,用户可以从该对话框中报告异常) ,并自动关闭应用程序。
但是,如果应用程序需要从集中位置执行自定义未经处理的异常处理,则应处理 DispatcherUnhandledException。
DispatcherUnhandledException 由 Application 针对主 UI 线程上运行的代码未处理的每个异常引发。
如果在后台 UI 线程 (具有其自己的 Dispatcher) 的线程或后台工作线程 (没有 Dispatcher) 的线程上处理异常,则异常不会转发到主 UI 线程。 因此, DispatcherUnhandledException 不会引发 。 在这些情况下,需要编写代码来执行以下操作:
- 处理后台线程上的异常。
- 将这些异常调度到主 UI 线程。
- 在主 UI 线程上重新引发它们,而无需处理它们以允许 DispatcherUnhandledException 引发。
有关详细信息,请参阅 线程模型 概述。
向 DispatcherUnhandledException 事件处理程序传递一个 DispatcherUnhandledExceptionEventArgs 参数,其中包含有关异常的上下文信息,包括:
- 异常 (Exception) 。
- Dispatcher它源自 (Dispatcher) 的 。
可以使用此信息来确定异常是否可恢复。 例如,可恢复异常可能是 , FileNotFoundException而不可恢复的异常可能是 StackOverflowException,例如。
处理来自 DispatcherUnhandledException的未经处理的异常并且不希望 WPF 继续处理它时,需要将 属性设置为 Handledtrue
。
与其他引发的事件 Application 不同, DispatcherUnhandledException 没有匹配的受保护虚拟实现 (OnDispatcherUnhandledException) 。 因此,派生自 Application 的类必须始终向 DispatcherUnhandledException 注册事件处理程序,才能处理未经处理的异常。
[官方文档]:Application.DispatcherUnhandledException 事件 (System.Windows) | Microsoft Learn