在没有WPF Application对象的情况下全局处理WPF异常

时间:2012-05-30 10:09:48

标签: c# wpf vba exception-handling interop

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

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块吗? / p>

我尝试过:

  • 附加到AppDomain.CurrentDomain.UnhandledException。不行。例外情况无法实现。
  • 阅读MSDN关于WPF和Win32互操作的相关部分(Ref 1Ref 2Ref 3)。那里没有提到例外情况。

1 个答案:

答案 0 :(得分:2)

改为附加到Dispatcher

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

如果还没有调度程序存在,访问CurrentDispatcher会自动创建一个单例调度程序,它也将由WPF窗口使用。