c #Windows窗体应用程序异常没有抛出!

时间:2011-06-30 15:11:29

标签: c# .net visual-studio

我有一个奇怪的问题,如果有人可以提供帮助,我将不胜感激。

我有以下功能:

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()中存在异常。

知道为什么吗?

2 个答案:

答案 0 :(得分:11)

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

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

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

最后一个难题是Win32消息泵内部抛出的异常处理方式不同(从Application.SetUnhandledExceptionMode Method 开始) - 您可能会发现令人困惑的是,异常也会根据是否有不同的处理方式该项目是否构建在Debug配置中。

您可能拥有Application.UnhandledException Event的处理程序 - 这可以解释您所描述的行为。

答案 1 :(得分:0)

        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());
        }