代码之家  ›  专栏  ›  技术社区  ›  JustABill

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

  •  3
  • JustABill  · 技术社区  · 14 年前

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

    [外部代码]

    文本框预览搜索事件

    [外部代码]

    正在设置ClassA的路径属性

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

    调用inotifyPropertyChanged事件

    [外部代码]

    打电话给getter索取b级儿童名单

    调用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运行这个程序,我根本不会收到异常通知,它只是因为无效的输入而中断。是的,正在调用应用程序启动事件。如何正确“捕获”此异常,以便提供友好的错误消息并终止程序?

    哦,如果我把try/catch放在调用堆栈的任何位置,而不是放在外部代码调用之后,它也不会捕捉到它。

    [编辑]

    经过一些搜索,我确信这是wpf绑定系统的副作用。由于成功创建了directoryinfo(即使是在不存在的目录上),因此在绑定检索值和wpf eats绑定异常之前,不会发生错误。 如果有人有任何进一步的想法,我将对此保持开放,但我认为我所能做的最好的事情是放弃延迟加载,如果我认为它可能导致异常,至少在应用程序得到更充分的证明之前。

    1 回复  |  直到 14 年前
        1
  •  -1
  •   Cameron MacFarland    14 年前

    尝试附加到应用程序 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 += ...
    }