我遇到过这样的情况。WinForms 应用程序有两种形式。主窗体有一个按钮,当用户单击它时,会显示模态对话框。对话框表单也有一个按钮,当用户单击它时,会引发异常。
当应用程序在调试器下运行并自行运行时,异常处理会有所不同。这是重现此行为的最少代码:
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
try
{
using (var dialog = new Form2())
{
dialog.ShowDialog();
}
}
catch (Exception ex)
{
MessageBox.Show("Oops! " + ex.Message);
}
}
}
public partial class Form2 : Form
{
public Form2()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
throw new NotImplementedException();
}
}
调试时,引发异常会关闭对话框,Form1.button1_Click 中的异常处理程序会处理异常。
运行应用程序本身时,引发异常不会关闭对话框。取而代之的是调用默认的 Application.ThreadException 处理程序。
为什么(以及为什么)行为会有所不同?怎样才能使它们相互协调?