1

我的 WinForms 应用程序安装 Application.ThreadException 事件处理程序来处理所有未处理的异常(处理程序显示一个对话框:发生错误,单击此处发送错误报告等)。

问题是当应用程序显示模式对话框时,我的事件处理程序没有被调用。当我显示 MessageBox 或我的异常对话框时,所有异常都会被默默地吞下。有没有办法抓住它们?

下面是一个模拟此行为的示例 WinForms 应用程序。当此应用程序显示 MessageBox 时,所有在后台抛出的异常都将丢失(不调用 ThreadException 处理程序):

using System;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;

class Program
{
  static void Main()
  {
    Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException);

    var form = new MyForm();
    Application.ThreadException += (s, e) =>
    {
        form.AppendText("ThreadException event handler is called.");
        MessageBox.Show("Error: " + e.Exception);
    };

    Application.EnableVisualStyles();
    Application.Run(form);
  }
}

class MyForm : Form
{
  public MyForm()
  {
    Controls.Add(TextBox = new TextBox
    {
      Multiline = true,
      Dock = DockStyle.Fill
    });

    ThrowUnhandledException(1);
    ThrowUnhandledException(2);
    ThrowUnhandledException(3);
  }

  private async void ThrowUnhandledException(int delaySeconds)
  {
    await Task.Delay(TimeSpan.FromSeconds(delaySeconds));
    AppendText("Throwing a NotImplementedException!");
    throw new NotImplementedException();
  }

  private TextBox TextBox { get; set; }

  public void AppendText(string message)
  {
    TextBox.AppendText(message + Environment.NewLine);
  }
}

编辑。我已经更新了代码以使事情更加清晰。

当抛出异常时,MyForm 会写入 TextBox:抛出 NotImplementedException!

当调用 ThreadException 处理程序时,它写道:调用 ThreadException 事件处理程序。然后它显示一个消息框。

如果所有异常都被捕获,我的 TextBox 将显示以下内容:

抛出 NotImplementedException!
调用 ThreadException 事件处理程序。
抛出 NotImplementedException!
调用 ThreadException 事件处理程序。
抛出 NotImplementedException!
调用 ThreadException 事件处理程序。

但它显示:

抛出 NotImplementedException!
调用 ThreadException 事件处理程序。
抛出 NotImplementedException!
抛出 NotImplementedException!
4

2 回答 2

2

您可以尝试更换

Application.ThreadException += (s, e) => MessageBox.Show("Error: " + e.Exception);

Application.ThreadException += (s, e) => Console.WriteLine(e.Exception); 

你会看到事件处理程序每​​次都会被调用。

于 2013-06-04T09:01:13.437 回答
0

我试过你的程序,但它似乎对我来说很好。被ThrowUnhandledException调用 3 次。所有三个消息都附加到文本框。

我尝试添加一个消息框:

ThrowUnhandledException(1);
ThrowUnhandledException(2);
ThrowUnhandledException(3);

MessageBox.Show("Hello");

但这也可以按预期工作。我得到了消息框,但是如果我在异常处理程序上放置一个断点,它会被调用三次。当我关闭消息框时,我可以在 MyForm 窗口中看到所有三个消息。

于 2013-06-04T08:33:07.170 回答