Catch块中的Messagebox并不总是显示

时间:2015-01-24 12:47:17

标签: c# .net winforms exception-handling

请考虑Program.cs中的以下代码片段:

    [STAThread]
    static void Main()
    {
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);

        // throw any exceptions inside event handlers
        Application.SetUnhandledExceptionMode(UnhandledExceptionMode.ThrowException);

        try
        {
            using(var frm = new Form1())
            {
                Application.Run(frm);
            }
        }
        catch
        {
            MessageBox.Show("Caught exception");
        }
    }

那就是:当表单抛出异常时,catch块会执行,并且会警告用户发生了错误。

这样可以正常工作,除非在表单的load事件中抛出异常:

    private void Form1_Load(object sender, EventArgs e)
    {
        throw new Exception("Boom");
    }

在这种情况下,catch块仍然执行,但MessageBox不会显示(MessageBox.Show()调用会立即返回)。

为什么?

经过一些试验和错误后,我发现了两个微小的变化,其中MessageBox 显示。一个是省略using块:

        try
        {
            Application.Run(new Form1());
        }
        catch
        {
            MessageBox.Show("Caught exception");
        }

一种是通过调用ShowDialog而不是Application.Run()。

        try
        {
            using(var frm = new Form1())
            {
                frm.ShowDialog();
            }
        }
        catch
        {
            MessageBox.Show("Caught exception");
        }

这对我来说都很奇怪。我偶然发现了这个问题,因为我正在编写一些通用的错误处理代码(我不知道代码的用户将如何启动他的应用程序)。

Q1:对这种奇怪的行为有解释吗?

Q2:我能做些什么来让第一个例子也能正常工作吗?


修改

有人将this question列为潜在副本。但是,我不认为这适用于此。我描述的情况发生在32位Windows上。是否附加调试器也无关紧要。最后,关联的问题是关于Visual Studio在load事件中首先出现异常时不会中断。在这里,Visual Studio打破了很好,它关于后续不会显示的MessageBox。

0 个答案:

没有答案