一番上のスクリーンショットは ThreadExceptionDialog です。これは、Winforms アプリがメッセージ ループ (Application.Run) によって起動されたイベント ハンドラーで爆発し、それ以外の方法でアプリが Application.ThreadException イベント ハンドラーを再割り当てしなかったという非常に特殊なケースで表示されます。これを使用するのはあまり良い方法ではありません。[続行] ボタンと [終了] ボタンのどちらをクリックするかをユーザーが知る合理的な方法はありません。必ず Application.SetUnhandledExceptionMode() を呼び出して無効にしてください。
一番下のスクリーン ショットは、Windows の既定のエラー報告ダイアログで、プログラムが未処理の例外で爆撃したときに Windows によって表示されます。ダイアログには、誰かが問題を診断して修正するのに役立つ十分な情報が表示されません。AppDomain.CurrentDomain.UnhandledException イベントのイベント ハンドラーを常に記述します。e.ExceptionObject.ToString() を表示および/またはログに記録し、 Environment.Exit() を呼び出してアプリを終了します。
Program.cs ソース コードを次のようにします。
[STAThread]
static void Main() {
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.SetUnhandledExceptionMode(UnhandledExceptionMode.ThrowException);
AppDomain.CurrentDomain.UnhandledException += CurrentDomain_UnhandledException;
Application.Run(new Form1());
}
static void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e) {
// TODO: improve logging and reporting
MessageBox.Show(e.ExceptionObject.ToString());
Environment.Exit(-1);
}