私はそのような状況に遭遇しました。WinFormsアプリケーションには2つの形式があります。メインフォームにはボタンがあり、ユーザーがそれをクリックすると、モーダルダイアログが表示されます。ダイアログフォームにもボタンがあり、ユーザーがそれをクリックすると、例外がスローされます。
アプリケーションがデバッガーで実行されている場合とそれ自体を実行している場合では、例外処理が異なります。この動作を再現する最小限のコードを次に示します。
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ハンドラーが呼び出されます。
なぜ(そして何のために)動作が異なるのですか?それを互いに一致させる方法は?