WPF - DispatcherUnhandledException似乎不起作用

时间:2008-12-24 05:43:08

标签: wpf exception-handling

我在VS2008中启动了一个新的WPF项目,然后添加了一些代码来捕获DispatcherUnhandledException。然后我向Window1添加了抛出异常 但错误不会被处理程序捕获。为什么呢?

   public App()
    {
        this.DispatcherUnhandledException += new DispatcherUnhandledExceptionEventHandler(App_DispatcherUnhandledException);

    }

    void App_DispatcherUnhandledException(object sender, DispatcherUnhandledExceptionEventArgs e)
    {
        System.Windows.MessageBox.Show(string.Format("An error occured: {0}", e.Exception.Message), "Error");
        e.Handled = true;
    }

 void Window1_MouseDown(object sender, MouseButtonEventArgs e)
    {
        throw new NotImplementedException();
    }

5 个答案:

答案 0 :(得分:4)

这可能是因为你有调试器处理异常的方式 - 调试/例外......应该允许你准确配置你想要的处理方式。

答案 1 :(得分:3)

请看以下msdn链接http://msdn.microsoft.com/en-us/library/system.windows.application.dispatcherunhandledexception.aspx 以下是相关的

如果在后台用户界面(UI)线程(具有自己的Dispatcher的线程)或后台工作线程(没有Dispatcher的线程)上未处理异常,则不会将异常转发到主UI线程。因此,不会引发DispatcherUnhandledException。在这些情况下,您需要编写代码来执行以下操作:

  1. 处理后台线程上的异常。
  2. 将这些例外发送到主UI线程。
  3. 在主UI空间线程上重新抛出它们而不处理它们以允许引发DispatcherUnhandledException。

答案 2 :(得分:2)

首先,即使在调试环境之外,我的处理程序似乎没有触发.....然后我意识到我忘了设置e.Handled = true。

事实上它是有效的但是因为e.Handled仍然是假的,标准的异常处理程序仍然开始并做了它的事情。

一旦我设置e.Handled = true,那么一切都是笨拙的。因此,如果它不适合您,请确保您已完成该步骤。

答案 3 :(得分:2)

这就是我处理它的方式。这不是很好,但请记住,这种类型的错误永远不应该作为开发人员进行调试。在你去生产之前,这些错误应该很长时间才能得到解决(所以可以说这不错)。在Startup项目中,在App.xaml(App.xaml.cs)代码后面,我输入以下代码。

  • OnStartup,创建DispatcherUnhandledException事件处理程序
  • 在处理程序中,使用MessageBox显示消息。请注意,可能尚未创建启动窗口,因此请勿尝试将其放在窗口中。
  • e。处理错误
  • 我希望看到有其他内部错误,所以我继续调用显示窗口,直到内部错误为空。

我不确定为什么代码块特殊字符没有正确格式化。对不起。

protected override void OnStartup(StartupEventArgs e)
    {
        // define application exception handler
        Application.Current.DispatcherUnhandledException += 
            AppDispatcherUnhandledException;

        // defer other startup processing to base class
        base.OnStartup(e);
    }

    private void AppDispatcherUnhandledException(object sender, DispatcherUnhandledExceptionEventArgs e)
    {
        runException(e.Exception);

        e.Handled = true;   
    }

    void runException(Exception ex)
    {
        MessageBox.Show(
            String.Format(
                "{0} Error:  {1}\r\n\r\n{2}",
                ex.Source, ex.Message, ex.StackTrace,
                "Initialize Error",
                MessageBoxButton.OK, 
                MessageBoxImage.Error));

        if (ex.InnerException != null)
        {
            runException(ex.InnerException);
        }
    }

答案 4 :(得分:1)

对于那些感兴趣的人

似乎IDE仍在打破异常,如果在IDE中单击“继续”,则会调用错误处理程序。