多线程WPF中未处理异常的“全局”异常处理程序问题

时间:2010-05-07 05:20:08

标签: c# wpf

我有一个程序,除其他外,需要能够在用户告诉它时刷新目录的内容。实际任务并不重要,但这是导致我发现此问题的最简单方法。 如果我告诉它打开一个不存在的目录,我会在VS中获得“未处理的异常”对话框,其中包含从外到内的堆栈跟踪:

[外部代码]

Textbox PreviewKeyUp事件

[外部代码]

正在设置ClassA的路径属性

ClassA的内部路径更新函数被称为

对INotifyPropertyChanged事件的调用

[外部代码]

为ClassB的子列表调用getter

调用ClassB的内部目录列表函数

然后它在这个内部函数中失败了。我在App.xaml.cs中有以下内容:

    private void Application_Startup(object sender, StartupEventArgs e)
    {
        AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException);
        Application.Current.Dispatcher.UnhandledException += new System.Windows.Threading.DispatcherUnhandledExceptionEventHandler(Dispatcher_UnhandledException);
    }

但他们的异常处理程序都没有被调用。如果我从VS外部运行这个程序,我根本没有得到异常的通知,它只是因为输入无效而中断。是的,正在调用Application_Startup事件。如何正确“捕获”此异常,以便我可以提供友好的错误消息并终止该程序?

哦,如果我把一个try / catch放在调用堆栈的任何地方经过一个外部代码调用,它也不会捕获它。

[编辑]

经过一番搜索,我很确定这是WPF绑定系统的副作用。因为正在成功创建DirectoryInfo(即使在不存在的目录上),在绑定去检索值之前不会发生错误 - 而WPF会尝试绑定异常。 如果有人有任何进一步的想法,我将离开这个开放,但我认为我能做的最好就是放弃延迟加载,如果我认为它可能导致异常,至少在应用程序得到更多证明之前。

1 个答案:

答案 0 :(得分:-1)

尝试附加到应用DispatcherUnhandledException

private void Application_Startup(object sender, StartupEventArgs e)
{
    AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException);
    Application.Current.Dispatcher.UnhandledException += new System.Windows.Threading.DispatcherUnhandledExceptionEventHandler(Dispatcher_UnhandledException);
    this.DispatcherUnhandledException += ...
}