1

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

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

这适用于WPF 应用程序项目。现在,我有一个带有 WPF windows 的库,它是从非 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)。那里没有提到例外情况。
4

1 回答 1

2

附加到Dispatcher

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

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

于 2012-05-30T10:21:21.030 回答