メインフォームで、Application.ThreadExceptionとApplication.Idleの2つのイベントをサブスクライブしました。理論的には、キャッチされない例外はメインフォームにバブルアップする必要があります。ただし、OnIdleイベントで例外が発生した場合、これは機能しません。システムがクラッシュするだけです。誰かがこの問題を解決する方法を知っていますか?本当にありがとう。
2 に答える
ThreadException イベントを取得しないことは、それほど論理的ではないことに同意します。ただし、このように動作します。ThreadException は、メッセージ ループがイベントをディスパッチし、イベント ハンドラーに未処理の例外がある場合にのみ発生します。Idle イベントは、ディスパッチするメッセージがなくなったときに発生し、まったく異なるコード パスに従います。
Idle イベント ハンドラーで例外をトラップすることで回避できます。
void Application_Idle(object sender, EventArgs e) {
try {
// Do stuff
}
catch (Exception ex) {
Application.OnThreadException(ex);
}
}
プログラムを終了するか続行するかをユーザーに決定させる場合、 ThreadException は複雑な問題であることに注意してください。また、プログラム内のすべての例外をキャッチするほど普遍的ではないことに注意してください。UI スレッド以外のスレッドで発生した例外、またはメッセージ ループの実行が開始される前に発生した例外を処理するには、AppDomain.CurrentDomain.UnhandledException が必要です。
ユーザーが [続行] をクリックできないようにするためにこれを行っている場合は、Application.SetUnhandledExceptionMode() を使用して ThreadException イベントを完全に無効にします。これで、すべてが AppDomain.UnhandledException を通過します。それはより良い方法です。
例外は、呼び出されたメソッドのスタックをバブルアップするだけです。
Idleイベントはフォームコードから呼び出されないため、どのコードにもバブリングしません。
代わりに、未処理の例外をキャッチする必要があります。
を見てみましょう:
それらの1つはあなたの例外を罠にかけます。