C# Windows Forms应用程序异常未被抛出!

9

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

我有以下函数:

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

我可以看到消息框(我收到“here”消息)在两种情况下都出现,但是:
[Case 1] 应用程序不会在异常上中断(在调试模式下),并保持沉默!
[Case 2] 应用程序正确地中断,我可以看到Foo()中有一个异常。
有什么想法吗?

那么,在case 1中,您是否在程序启动时看到消息框? - Anton Semenov
是的,正如我所说:在这两种情况下,我都收到了“here”消息。 - Mo Valipour
3
从 Visual Studio 开启异常处理开始:调试(Debug) -> 异常(Exceptions) -> 公共语言运行时异常(Common Language Runtime Exceptions),查看是否会在 Debug 模式中出现。 - sll
1
如果你在调用foo()的周围加上try/catch块,那么目前“保持沉默”的情况会发生什么? - dlev
@sll:太棒了!它起作用了,请将其添加为答案,这样我就可以接受你的答案了。但现在的问题是为什么?为什么Case2有效而Case1无效? - Mo Valipour
显示剩余5条评论
2个回答

11

我猜测调用构造函数的代码看起来类似于这样:

Form2 form = new Form2();
Application.Run(form);
关键的部分在于你直接调用了Form2的构造函数,而实际上是应用程序类/消息泵在调用Form2_Load。最后需要注意的是,在Win32消息泵中抛出的异常处理方式不同(首先请参阅Application.SetUnhandledExceptionMode方法),同时基于项目是否以Debug配置构建,异常处理也有所不同。如果你为Application.UnhandledException事件编写了处理程序,那么这可能会解释你所描述的行为。

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

但目标是在代码行上引发异常,而不是捕获它。 - Mo Valipour
你的构造函数抛出了异常 - 你可以在构造函数内部或外部捕获它。你在UI线程上抛出了异常 - 必须有人来捕获它 - 默认的“发生异常”窗口或者你的处理程序。 - DiVan
我再次强调问题不在于捕获异常,而是(曾经)在发生异常时 Visual Studio 没有显示异常。 - Mo Valipour

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接