WPF - DispatcherUnhandledException 似乎不起作用

问题描述 投票:0回答:5

我在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();
    }
wpf exception
5个回答
6
投票

发生这种情况是因为调试器处理异常的方式 - 调试/异常...应该允许您准确配置您想要的处理方式。


4
投票

我就是这样处理的。 这不太漂亮,但请记住,这种类型的错误永远不应该让开发人员无法进行调试。 这些错误应该在投入生产之前就得到解决(所以这不太漂亮也没关系)。 在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);
        }
    }

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
投票

起初,即使在调试环境之外,我的处理程序似乎也没有触发......然后我意识到我忘记设置

e.Handled = true

事实上它正在工作,但因为

e.Handled
仍然是
false
,标准异常处理程序仍然启动并完成它的工作。

一旦我设置了

e.Handled = true
,那么一切都变得很美好。 因此,如果它不适合您,请确保您已完成该步骤。


1
投票

有兴趣的人

IDE 似乎仍然因异常而中断,如果您在 IDE 中单击“继续”,它会调用错误处理程序。

© www.soinside.com 2019 - 2024. All rights reserved.