C#中未处理的异常处理

Unhandled Exception handling in C#

我想了解 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/program "choose" 如何弹出消息。

谢谢。

在 WinForms 应用程序中,事件处理程序由 WindowsFormsSynchronizationContext 调用。当事件处理程序抛出未处理的异常时,上下文通过显示第一个错误对话框来处理它。那时同步上下文(它只是一个消息泵)仍然是 运行 并且它仍然可以继续处理其他事件,因此您可以选择。

相比之下,Main 方法由操作系统本身调用,以启动应用程序。如果那里有未处理的异常,WIndows 别无选择,只能终止应用程序,它会显示第二个对话框来通知您。