我有一个程序,除其他外,需要能够在用户告诉它时刷新目录的内容。实际任务并不重要,但这是导致我发现此问题的最简单方法。 如果我告诉它打开一个不存在的目录,我会在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会尝试绑定异常。 如果有人有任何进一步的想法,我将离开这个开放,但我认为我能做的最好就是放弃延迟加载,如果我认为它可能导致异常,至少在应用程序得到更多证明之前。
答案 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 += ...
}