2012-06-11 11 views
5

AppDomain.CurrentDomain.UnhandledExceptionのイベントに登録すると、UnhandledExceptionEventArgsIsTerminatingフラグがtrueになる条件はありますか?私。例外を致命的とみなす原因は何ですか?UnhandledExceptionEventArgs.IsTerminatingフラグがtrueまたはfalseになる原因は何ですか?

デフォルトでは、処理されていないすべての例外は、別途設定されていない限り致命的なものになることはありますか?

答えて

7

このプロパティは常にtrueです。以前は.NET 1.xの時代には間違っていた可能性がありました。このバージョンでは、プロセス全体が終了することなく、処理されない例外でスレッドが終了することができました。それだけでうまくいきませんでした。プログラマはイベントハンドラを実装していませんでした(または、イベントの例外を正しく処理する方法を知らなかったので)スレッドは何の通知もせずに死にました。これを持たないことはほとんど不可能で、プログラムの失敗を診断することは困難です。

マイクロソフトでは、.NET 2.0の既定の動作を変更しました。処理されない例外がプログラムを終了します。技術的にはこの動作をオーバーライドすることは可能ですが、カスタムCLRホストはIHostPolicyManagerインターフェイスを実装することでプロセスを維持できます。デフォルトホストは<legacyUnhandledExceptionPolicy> config要素をサポートしています。それを使用しないでください、その方法はドラゴンズです。

+0

単純に試してみると、アプリケーションで実行されたときと同じUnhanded例外(InvalidDataExceptionなど)がTrueに設定されていることがわかりますが、ユニットテスト(vstest.executionengine)で同じコードを実行するとfalseに設定されます。 VS2017のexe)。 –

3

いいえ、別のアプリケーションによって生成された管理スレッドからの未処理の例外は、スレッド全体を停止させるため、アプリケーション全体ではないため、IsTerminatingはfalseとなります。この状況で私が今までにIsTerminatingを誤って見たのは唯一のことであり、MSDN pageはこれも主な使用事例だと言います。

0

私はテスト目的でこれを使用しました。例外を記録するUnhandledExceptionHandlerをテストしたかったのです。 私はメッセージを記録できるように設定しましたが、テストスレッドを撃退しません。

これは、通常、これは私が見た他の状況でも、IsTerminatingフラグがtrueに設定されていることを意味します。

関連する問題