.NET 2.0アプリでの例外処理の修正に取り組んでいたところ、Application.ThreadExceptionの奇妙な問題に遭遇しました。
私が欲しいのは、GUI要素の背後にあるイベント(たとえば、button_Clickなど)からのすべての例外をキャッチできるようにすることです。次に、これらの例外を「致命的」でフィルタリングしたいと思います。たとえば、あるタイプの例外ではアプリケーションを実行し続け、他のタイプではアプリケーションを終了する必要があります。
別の.NET2.0アプリでは、デフォルトでは、デバッグモードでのみ、例外が実際にApplication.RunまたはApplication.DoEvents呼び出しを残すことを学びました。リリースモードではこれは発生せず、Application.ThreadExceptionイベントを使用して例外を「キャッチ」する必要があります。
ただし、Application.ThreadExceptionイベントのThreadExceptionEventArgsで渡される例外オブジェクトは、常に例外チェーンの最も内側の例外であることに気付きました。ただし、ロギング/デバッグ/設計の目的で、例外のチェーン全体が本当に必要です。たとえば、SocketExceptionを処理するだけの場合、どの外部システムが失敗したかを判断するのは簡単ではありません。たとえば、NpgsqlExceptionとしてラップされている場合、少なくともデータベースの問題であることがわかります。
では、このイベントからの例外のチェーン全体に到達するにはどうすればよいですか?それも可能ですか、それとも別の方法で例外処理を設計する必要がありますか?
Application.SetUnhandledExceptionModeを使用して回避策がありますが、独自のメッセージループをロールする必要があるため、これは理想からはほど遠いことに注意してください。
編集:より多くの間違いを防ぐために、GetBaseException()メソッドは私が望むことをしません:それはただ最も内側の例外を返しますが、私がすでに持っているのは最も内側の例外だけです。一番外側の例外を取得したいです!