C#中未处理的异常处理

问题描述 投票:0回答:1

我试图了解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函数引发异常(通过删除注释前缀),我将收到以下消息:timer1_Tick Exception

如果从Main函数引发异常(通过删除注释前缀),我将收到以下消息:Main Exception

为什么我会收到2条不同的消息,以及Windows /程序如何“选择”弹出的消息。

谢谢。

c# exception unhandled-exception
1个回答
1
投票

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

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

© www.soinside.com 2019 - 2024. All rights reserved.