如果您的意思是处理Application.ThreadException事件:它仅在从 WinForms 线程抛出的异常时触发。通常,应用程序中有一个 WinForms 线程:主线程。
更新。
这是演示Application.ThreadException和 AppDomain.UnhandledException 行为差异的示例:
1)Program类:
static class Program
{
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.ThreadException += new ThreadExceptionEventHandler(Application_ThreadException);
AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException);
Application.Run(new Form1());
}
static void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e)
{
Debug.WriteLine(Thread.CurrentThread.Name);
}
static void Application_ThreadException(object sender, ThreadExceptionEventArgs e)
{
Debug.WriteLine(Thread.CurrentThread.Name);
}
}
2)主窗体(一个有两个按钮的窗体)代码隐藏:
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
throw new InvalidOperationException();
}
private void button2_Click(object sender, EventArgs e)
{
new Thread(() => { throw new InvalidOperationException(); })
{
Name = "Worker Thread"
}.Start();
}
}
当您单击 button1 时,您会从 WinForms 线程中抛出异常。Application_ThreadException因此,默认情况下将处理此异常。
当您单击 button2 时,您会从不是 WinForms 线程的工作线程抛出异常。Application.ThreadException在这种情况下不会触发,而是AppDomain.UnhandledException触发事件(并被CurrentDomain_UnhandledException调用,在输出窗口中产生“工作线程”行)。