22

StackOverflowException MSDNは、.NETFramework2以降のtry-catchブロックではキャッチできないと述べています。

.NET Frameworkバージョン2.0以降、StackOverflowExceptionオブジェクトはtry-catchブロックでキャッチできず、対応するプロセスはデフォルトで終了します。

同じ動作をする他の例外はありますか?

4

1 に答える 1

37

はい、他にもいくつかあります。

  • ThreadAbortedExceptionは特別です。catchブロックがResetAbort()を呼び出さない限り、キャッチされると常に再レイズされます。CLRがスレッドの失礼なアボートを実行すると、完全にキャッチできなくなります。AppDomainがアンロードされたとき、たとえば、通常はプログラムの終了時に実行されます。

  • ネイティブコードによって開始されたスレッド内のアンマネージコードによってスローされたネイティブ例外は、キャッチできません。ここでの一般的なシナリオは、独自のスレッドを開始するCOMコンポーネントです。CLRはそのような例外をトラップする力がなく、スレッドについて知らず、キャッチブロックを挿入できません。ネイティブコードが例外をキャッチしない場合、Windowsはプロセスを終了します。

  • 重要なファイナライザーでない限り、ファイナライザーによってスローされた例外。プロセスを終了するファイナライザースレッドを中止します。

  • .NET 4.0以降、ExecutionEngineExceptionはキャッチできません。内部データ構造が危険にさらされていることを検出すると、CLRによってスローされます。最も一般的には、ガベージコレクターがビジー状態のときに発生するAccessViolationExceptionによって発生します。GCヒープが危険にさらされたときにマネージコードを実行し続けることは危険な提案であり、悪用可能であり、.NET4はプラグを完全に引っ張っています。

  • .NET 4.0バージョンのCLRから始まりますが、以前のバージョンで相互運用するアンマネージコードにも存在する可能性があるため、MicrosoftのセキュアCRTは、セキュリティの問題が検出されるとすぐにプログラムを終了できます。これは実際には例外ではありません。コードはプロセスが危険にさらされており、例外を安全に処理できないと見なすため、プロセスは即座に終了します。一般的なケースは、ネイティブ関数のスタックフレームが破壊される場合です。これは、ネイティブコードで一般的な問題であり、ウイルスコードがリターンアドレスをいじって任意のコードを実行するために使用されます。「スタックバッファオーバーフロー」と呼ばれる攻撃シナリオ。.NET 4.0のリリース後の早い段階で、CLRコードにいくつかの誤ったアラームがありましたが、私はかなり長い間何も見ていません。あなたは自分でそのような中絶を引き起こすことができますstackalloc

  • 非常に悪名高いことに、64ビットオペレーティングシステムのWOW64エミュレーションレイヤーで32ビットモードでコードを実行し、デバッガーが接続されている場合に、Windowsメッセージハンドラーによってスローされる例外。Winformsでの厄介なLoadイベントで最もよく知られていますが、他のメッセージや他のランタイム環境でも発生します。醜い詳細はこの答えにあります。

  • .NET 4.5以降、Microsoftが破損状態例外(CSE)として分類する例外。それらはキャッチできますが、それは、ユーザーの利益のために診断を生成し、無条件にアプリを終了する以外は何もしないトップレベルの例外ハンドラーによってのみ実行する必要があります。バックグラウンダーは、この雑誌の記事で入手できます。

  • コードの実行を開始する前にジッターによってスローされた例外は、キャッチまたは報告できません。Main()メソッドのコンパイルの失敗は一般的なケースであり、通常はFileNotFoundExceptionです。

于 2012-11-26T14:36:35.440 に答える