12

我在 VS2008 中开始了一个新的 WPF 项目,然后在 trap 中添加了一些代码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();
    }
4

5 回答 5

5

这可能是因为您使用调试器处理异常的方式 - 调试/异常...应该允许您准确配置您希望如何处理它。

于 2008-12-24T17:29:48.577 回答
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。
于 2009-12-03T08:30:34.940 回答
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);
        }
    }
于 2016-03-02T17:16:06.637 回答
2

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

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

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

于 2009-04-16T19:01:20.990 回答
1

对于那些有兴趣的人

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

于 2008-12-24T07:32:07.847 回答