3

私の知る限り、tryブロックfinallyは、いくつかの をスローする可能性のあるコードを実行するために使用されます。また、何らかのタイプの例外を処理する準備ができている場合、および/またはそれらを例外として除外している場合は、ブロックをexception追加します。しかし、私がこれを実行したとき..catchFileIOExceptionAccessRight

private void button1_Click(object sender, EventArgs e)
    {
        try
        {
            Environment.FailFast("It failed");
        }
        finally
        {
            MessageBox.Show("Done");
        }
    }

その休憩は例外であり、

FatalExecutionEngineError が検出されました
メッセージ: ランタイムで致命的なエラーが発生しました。エラーのアドレスは、スレッド 0xd04 の 0x032526f4 でした。エラー コードは 0x80131623 です。このエラーは、CLR のバグ、またはユーザー コードの安全でない部分または検証不可能な部分のバグである可能性があります。このバグの一般的な原因には、COM 相互運用機能または PInvoke のユーザー マーシャリング エラーが含まれ、スタックが破損する可能性があります。

msdnは言う

通常、未処理の例外によってアプリケーションが終了する場合、finally ブロックが実行されるかどうかは重要ではありません。ただし、その状況でも実行する必要があるステートメントが finally ブロックにある場合、1 つの解決策は、try-finally ステートメントに catch ブロックを追加することです。

それで、catchブロックを追加しましたが、それでも同じことを言います。

    private void button1_Click(object sender, EventArgs e)
    {
        try
        {
            Environment.FailFast("It failed");
        }
        catch (Exception ex)
        {

        }
        finally
        {
            MessageBox.Show("Done");
        }
    }

同じエラーで再び失敗しました。最終的にコードブロックが常に実行される(少なくともcatchが追加された場合)と言うCLRに関しては、そうではありません。レビュー/意見はありますか?

また、ここにスナップショットがあります..

ここに画像の説明を入力

4

1 に答える 1

7

これは仕様によるものです。の目的Environment.FailFastは、実行をただちに停止することです。設計上、catch または finally ブロックでコードを実行しません。

ドキュメントには次のように記載されています。

このメソッドは、アクティブな try/finally ブロックまたはファイナライザーを実行せずにプロセスを終了します。

FailFast メソッドは、メッセージ文字列を Windows アプリケーション イベント ログに書き込み、アプリケーションのダンプを作成してから、現在のプロセスを終了します。メッセージ文字列は、Microsoft へのエラー報告にも含まれています。

アプリケーションの状態が修復不可能なほど破損している場合は、Exit メソッドの代わりに FailFast メソッドを使用してアプリケーションを終了し、アプリケーションの try/finally ブロックとファイナライザーを実行すると、プログラム リソースが破損します。

これにより、finally ブロック内のコードが実行されないことが明確になります。後でコードを実行する方法があったとしても、それはほとんど役に立たないEnvironment.FailFastでしょう。Environment.FailFastその存在そのものは、呼び出した後にコードが実行されないという事実に基づいています。

あなたは次のような文書を指しています(私のものを強調してください):

通常、未処理の例外によってアプリケーションが終了する場合、finally ブロックが実行されるかどうかは重要ではありません。ただし、その状況でも実行する必要があるステートメントが finally ブロックにある場合、1 つの解決策は、try-finally ステートメントに catch ブロックを追加することです。

しかし、それらの言葉はここではまったく当てはまりません。Environment.FailFastを呼び出すと、未処理の例外によってアプリケーションが終了すると想定しています。そうではありません。アプリケーションはその場で終了するだけです。未処理の例外はありません。

于 2013-03-02T11:14:33.887 に答える