在没有 WPF 应用程序对象的情况下全局处理 WPF 异常

本文关键字:WPF 全局 情况下 处理 异常 对象 应用程序 | 更新日期: 2023-09-27 18:35:56

WPF 提供了一种非常方便的方法来处理意外异常:我可以将处理程序附加到 Application.DispatcherUnhandledException 事件,所有未处理的异常都是这样进行的:

Application.Current.DispatcherUnhandledException += (sender, e) => {
    // Show message, log exception, etc.
};

这非常适合 WPF 应用程序项目。现在,我有一个带有 WPF 窗口的库,它是从非 WPF 应用程序调用的(它是一个旧的 VBA 应用程序,WPF 库可通过 COM 互操作访问)。

所以,问题是:我可以创建、打开和显示 WPF 窗口(这工作正常),但我没有Application实例Application.Currentnull.我使用 WPF 类,但在 WPF 应用程序框架之外操作它们。

目前,此解决方案的唯一缺点是 WPF 窗口事件处理程序代码中的异常被静默吞噬:

void Button_click(sender as object, e as RoutedEventArgs) {
    ...
    // some exception occurs here, but nobody hears her scream
    ...
}

我不喜欢这样。我想记录它们并显示错误消息。

的问题:在这种情况下,有没有办法全局捕获未经处理的异常,或者我是否必须向我编写的每个 WPF 窗口事件处理程序代码添加一个 try-catch-log 块?

我尝试过的:

  • 附加到AppDomain.CurrentDomain.UnhandledException .不行。例外不会到达那里。
  • 阅读 MSDN 中有关 WPF 和 Win32 互操作的相关部分(参考文献 1、参考文献 2、参考文献 3)。那里没有提到例外情况。

在没有 WPF 应用程序对象的情况下全局处理 WPF 异常

改为附加到Dispatcher

Dispatcher.CurrentDispatcher.DispatcherUnhandledException += (sender, e) => { 
    // Show message, log exception, etc. 
}; 

如果尚不存在调度程序,则访问CurrentDispatcher会自动创建一个单一实例调度程序,该调度程序也将由 WPF 窗口使用。