.NET 1.x Windows フォーム アプリケーションでのハンドルされない例外の動作は、次のものに依存します。
- 例外をスローしたスレッドのタイプ
- ウィンドウ メッセージの処理中に発生したかどうか
- デバッガーがプロセスにアタッチされたかどうか
- DbgJitDebugLaunchSetting レジストリ設定
- App.Config の jitDebugging フラグ
- Windows フォームの例外ハンドラーをオーバーライドしたかどうか
- CLR の例外イベントを処理したかどうか
- 月の満ち欠け
未処理の例外の既定の動作は次のとおりです。
- ウィンドウ メッセージをポンピングするときにメイン スレッドで例外が発生した場合は、Windows フォームの例外ハンドラーによってインターセプトされます。
- ウィンドウ メッセージのポンピング時にメイン スレッドで例外が発生した場合、Windows フォームの例外ハンドラーによってインターセプトされない限り、アプリ プロセスは終了します。
- 手動、スレッド プール、またはファイナライザー スレッドで例外が発生した場合、その例外は CLR によって取り込まれます。
未処理の例外の連絡先は次のとおりです。
- Windows フォームの例外ハンドラー。
- JIT デバッグ レジストリ スイッチ DbgJitDebugLaunchSetting。
- CLR 未処理の例外イベント。
Windows フォームの組み込みの例外処理は、既定で次のことを行います。
- 次の場合に未処理の例外をキャッチします。
- 例外はメインスレッドにあり、デバッガーは接続されていません。
- ウィンドウ メッセージの処理中に例外が発生します。
- App.Config で jitDebugging = false。
- ユーザーにダイアログを表示し、アプリの終了を防ぎます。
で jitDebugging = true を設定することにより、後者の動作を無効にすることができますApp.Config
。ただし、これがアプリの終了を止める最後のチャンスになる可能性があることを忘れないでください。したがって、未処理の例外をキャッチする次のステップは、イベント Application.ThreadException を登録することです。次に例を示します。
Application.ThreadException += new
Threading.ThreadExceptionHandler(CatchFormsExceptions);
HKEY_LOCAL_MACHINE\Software.NetFramework の下のレジストリ設定 DbgJitDebugLaunchSetting に注意してください。これには、私が認識している 3 つの値のいずれかがあります。
- 0: 「デバッグまたは終了」を求めるユーザー ダイアログを表示します。
- 1: CLR が処理できるように例外を通過させます。
- 2: DbgManagedDebugger レジストリ キーで指定されたデバッガーを起動します。
Visual Studio で、メニューの[ツール] → [オプション] → [デバッグ] → [JIT ] に移動して、このキーを 0 または 2 に設定します。ただし、通常、エンド ユーザーのマシンでは値 1 が最適です。このレジストリ キーは、CLR 未処理の例外イベントの前に実行されることに注意してください。
この最後のイベントは、未処理の例外をログに記録する最後のチャンスです。それは、Finally ブロックが実行される前にトリガーされます。このイベントは次のようにインターセプトできます。
AppDomain.CurrentDomain.UnhandledException += new
System.UnhandledExceptionEventHandler(CatchClrExceptions);