スニペットのcatch句は、出荷バージョンのアプリでは何もキャッチしません。デバッガーを接続して実行すると機能します。
不足しているのは、Application.ThreadExceptionの動作方法です。このイベントは、未処理の例外が検出されるたびに発生します。ただし、コードをデバッグする場合、この機能は有効になりません。イベントを発生させるための例外ハンドラーはインストールされていません。これは、未処理の例外をデバッグするための適切な方法があるために行われました。コードによってその動作が変更され、 tryブロックがアクティブになり、catchハンドラーが例外を取得します。
コードを同じように動作させるには、未処理の例外処理戦略を変更する必要があります。このような:
[STAThread]
static void Main() {
try {
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.SetUnhandledExceptionMode(UnhandledExceptionMode.ThrowException);
Application.Run(new Form1());
}
catch (Exception ex) {
// etc..
}
}
これで、catch句は常に例外をキャッチします。メインスレッドで発生している限り、ワーカースレッドで発生した例外をキャッチしません。統一された処理の代わりに、次のコードを検討してください。
[STAThread]
static void Main() {
AppDomain.CurrentDomain.UnhandledException += AllUnhandledExceptions;
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.SetUnhandledExceptionMode(UnhandledExceptionMode.ThrowException);
Application.Run(new Form1());
}
private static void AllUnhandledExceptions(object sender, UnhandledExceptionEventArgs e) {
var ex = (Exception)e.ExceptionObject;
// Display or log ex.ToString()
//...
Environment.Exit(System.Runtime.InteropServices.Marshal.GetHRForException(ex));
}