2010-05-07 98 views
3

我有一个程序,除了别的以外,当用户告诉它时,需要能够刷新目录的内容。实际的任务并不重要,但这是导致我知道发生这个问题的最简单的方法。 如果我告诉它打开一个不存在的目录,我得到的“未处理的异常”对话框中VS与堆栈跟踪,从外到内:多线程WPF中未处理异常的“全局”异常处理程序的问题

[外部代码]

文本框PreviewKeyUp事件

[外部代码]

被设置ClassA的的路径属性

ClassA的内部路径更新函数被调用

调用到INotifyPropertyChanged的事件

[外部代码]

吸气剂呼吁儿童

到ClassB的内部目录列表函数的调用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则会执行绑定异常。 如果任何人有任何进一步的想法,我会离开这个开放的,但我认为我能做的最好的事情是放弃延迟加载,如果我认为它可能导致异常,至少在应用程序更加证明之前。

+0

可以显示实际执行目录刷新的代码吗?如果你发布了抛出的实际异常,它会非常有帮助。 – 2010-05-07 05:49:34

+0

失败的代码是对DirectoryInfo.GetDirectories()的调用,但例外情况是该目录实际上并不存在,但那不是真正的重点,我更感兴趣的是为什么我无法捕获任何*像这样的例外。 – JustABill 2010-05-07 14:35:32

回答

-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 += ... 
} 
+0

我实际上已经尝试过,但仍然没有。此外,我很确定该事件只是Application.Current.Dispatched.UnhandledException事件的别名。 – JustABill 2010-05-07 14:34:09

+0

DispatcherUnhandledException使用内部Dispatcher对象,并将处理程序添加到UnhandledException事件中,虽然它确实可以保证添加/删除发生在UI线程上,但没有其他区别。使用反射工具查看DispatcherUnhandledException。 – Console 2014-04-30 16:01:25