【问题标题】:WPF - DispatcherUnhandledException does not seem to workWPF - DispatcherUnhandledException 似乎不起作用
【发布时间】:2010-09-28 07:08:02
【问题描述】:

我在 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-handling


    【解决方案1】:

    这可能是由于调试器处理异常的方式造成的——调试/异常...应该允许您准确配置您想要的处理方式。

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

      • 除非清单中的代码在主 UI 线程上抛出异常。
      • 降级 ... 因为在示例中异常是在主线程上引发的
      【解决方案3】:

      这就是我的处理方式。这不是很漂亮,但请记住,这种类型的错误绝不应该通过作为开发人员的调试。在你投入生产之前,这些错误应该早就解决了(所以这不是很好)。在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】:

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

        事实上它是有效的,但是因为 e.Handled 仍然是错误的,标准异常处理程序仍然会启动并完成它的工作。

        一旦我设置了 e.Handled = true,那么一切都变得很糟糕。因此,如果它不适合您,请确保您已完成该步骤。

        【讨论】:

          【解决方案5】:

          对于那些感兴趣的人

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2016-11-29
            • 2016-02-01
            • 2020-09-23
            • 2010-12-05
            • 2011-06-14
            • 2015-01-10
            • 2016-02-24
            相关资源
            最近更新 更多