マネージド スレッドの例外

共通言語ランタイムはスレッド内のほとんどのハンドルされない例外をそのまま続行させます。 ほとんどの場合、これはハンドルされない例外によってアプリケーションが終了することを意味します。 しかし、共通言語ランタイムには、プログラム フローの制御に使用する特定のハンドルされない例外について、次のような安全策が用意されています。

  • Abort が呼び出されたため、スレッドで ThreadAbortException がスローされる。 これが該当するのは .NET Framework アプリのみです。

  • スレッドが実行中のアプリケーション ドメインがアンロードされると、スレッドで AppDomainUnloadedException がスローされる。

  • 共通言語ランタイムまたはホスト プロセスは、内部例外をスローすることによってスレッドを終了します。

共通言語ランタイムによって作成されたスレッドでこれらの例外がハンドルされない場合、その例外によってスレッドは終了しますが、共通言語ランタイムは例外を続行させません。

メイン スレッドまたはアンマネージ コードからランタイムに入ったスレッドでこれらの例外がハンドルされない場合、例外は通常どおり続行するため、アプリケーションが終了します。

注意

マネージド コードによって例外ハンドラーがインストールされる前に、ランタイムによってハンドルされない例外をスローできます。 マネージド コードにこのような例外をハンドルする機会がない場合でも、例外を続行させることができます。

開発時におけるスレッド処理の問題の露呈

アプリケーションを終了せずに、スレッドが暗黙に失敗したまま放置されていると、プログラミングの深刻な問題が検出されない状態になる可能性があります。 長期間実行されるサービスや他のアプリケーションでは、これは特に問題となります。 スレッドが失敗すると、プログラムの状態が徐々に破損します。 アプリケーションのパフォーマンスが低下、またはアプリケーションが応答しなくなる場合があります。

スレッド内でハンドルされない例外を続行させておき、結果としてオペレーティング システムにそのプログラムを終了させることで、開発およびテスト中にこのような問題が明らかになります。 プログラムの終了に関するエラー報告はデバッグをサポートします。

ホストのオーバーライド

アンマネージ ホストはホスト API の ICLRPolicyManager インターフェイスを使用して、共通言語ランタイムの既定のハンドルされない例外ポリシーをオーバーライドできます。 ICLRPolicyManager::SetUnhandledExceptionPolicy 関数を使用して、ハンドルされない例外のポリシーを設定します。

関連項目