我试图了解C#程序如何处理未处理的异常。
我正在Windows窗体项目中进行测试,如果答案在其他项目类型中不同,请告诉我。
我正在从.exe文件而不是从Visual Studio调试器运行程序。
代码:
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
//timer1.Interval = 10000
private void timer1_Tick(object sender, EventArgs e)
{
//throw new Exception(Thread.CurrentThread.ManagedThreadId.ToString() + " This is an exception");
}
}
static class Program
{
static Form1 newForm;
static void Main()
{
Thread FormThread = new Thread(NewForm);
FormThread.Start();
Thread.Sleep(5000);
//throw new Exception(Thread.CurrentThread.ManagedThreadId.ToString() + " This is an exception");
}
static void NewForm()
{
newForm = new Form1();
Application.Run(newForm);
}
}
我的问题是C#程序中未处理的异常的Windows响应是什么?
在上面的示例中:
如果从timer1_Tick函数引发异常(通过删除注释前缀),我将收到以下消息:
如果从Main函数引发异常(通过删除注释前缀),我将收到以下消息:
为什么我会收到2条不同的消息,以及Windows /程序如何“选择”弹出的消息。
谢谢。
在WinForms应用程序中,事件处理程序由WindowsFormsSynchronizationContext
调用。当事件处理程序引发未处理的异常时,上下文将通过显示第一个错误对话框来处理该异常。此时,同步上下文(仅是消息泵)仍在运行,并且仍可以继续处理其他事件,因此可以选择。
Main
方法,相反,由操作系统本身调用,以启动应用程序。如果那里有未处理的异常,则Windows只能终止应用程序,它会显示第二个对话框以通知您。