我的 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!