c#Windows窗体应用程序异常未引发

本文关键字:异常 窗体 应用程序 c#Windows | 更新日期: 2023-09-27 18:00:42

我有一个奇怪的问题,如果有人能帮忙,我将不胜感激。

我有以下功能:

void Foo()
{
    MessageBox.Show("here");
    throw new Exception();
}

我在以下两种情况下称之为(单独使用,而不是同时使用):

private void Form2_Load(object sender, EventArgs e)
{
     // Case 1
     Foo();
}
public Form2()
{
    InitializeComponent();
    // Case 2
    Foo();
}

在这两种情况下,我都可以看到消息框(我在这里收到消息),但:

[案例1]应用程序不会在异常时中断(在调试模式下),并保持静默!

【案例2】应用程序正确中断,我可以看到Foo()中有一个异常。

知道为什么吗?

c#Windows窗体应用程序异常未引发

我的猜测是,对构造函数的调用看起来有点像:

Form2 form = new Form2();
Application.Run(form);

关键部分是直接调用Form2的构造函数,而调用Form2_Load的是应用程序类/消息泵。

最后一个难题是Win32消息泵中抛出的异常处理方式不同(首先请参阅Application.SetUnhandledExceptionMode方法)-您可能会发现令人困惑的是,根据项目是否在调试配置中构建,异常处理方式也不同。

您可能有Application.UnhandledException事件的处理程序,这将解释您所描述的行为。

        Application.ThreadException +=
            (o, args) =>
                {
                    // Case 1
                    MessageBox.Show(args.Exception.ToString());
                };
        try
        {
            Application.Run(new Form1());
        }
        catch (Exception ex)
        {
            // Case 2
            MessageBox.Show(ex.ToString());
        }