请考虑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。