2008-12-24 144 views
9

我在VS2008中启动了一个新的WPF项目,然后添加了一些代码来捕获DispatcherUnhandledException。然后我给Window1 添加了一个抛出异常,但错误并未被处理程序捕获。为什么?WPF - DispatcherUnhandledException似乎不起作用

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

由于调试器处理异常的方式 - 调试/例外...应该允许您准确配置您希望如何处理它。

1

对于那些有兴趣

看来,IDE仍然打破例外,而且如果您单击继续在IDE中调用它的错误处理程序。

2

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

事实上它正在工作,但因为e.Handled仍然是错误的,所以标准的异常处理程序仍然被踢入并做了它的事情。

一旦我设置e.Handled = true,那么一切都是hunky dory。所以如果它不适合你,请确保你已经完成了这一步。

3

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

如果一个异常没有在任何背景的用户界面(UI)线程(有自己的调度程序线程)或后台工作线程处理(一线程没有Dispatcher),异常不会被转发到主UI线程。因此,不会引发DispatcherUnhandledException。在这些情况下,您需要编写代码来执行以下操作:

  1. 处理后台线程的异常。
  2. 将这些异常分发给主UI线程。
  3. 在主UI线程上重新绘制它们,而不处理它们以允许引发DispatcherUnhandledException。
+4

除了列表中的代码在主UI线程上抛出异常。 – svick 2011-07-22 08:59:24

0

这是我如何处理它。这不是很好,但请记住,这种类型的错误绝对不应该让它作为开发者进行调试。那些错误应该在你投入生产之前被长期解决(所以它可以,这不太好)。在启动项目中,在后面的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); 
     } 
    }