24

「Console.WriteLine("asdf");」という行がないのはなぜですか 実行?他のすべてはそうです。finally スコープから飛び出すこともできないのではないでしょうか。

static bool Func()
{
    try
    {
        try
        {
        }
        finally
        {
            try
            {
                throw new ApplicationException();
            }
            finally
            {
                Console.WriteLine("asd");
            }

            Console.WriteLine("asdf");
        }
    }
    finally
    {
        Console.WriteLine("asd");
    }
}
4

7 に答える 7

30

finally ブロックは、try ブロックが例外をスローした場合に入力されることを保証するだけです (少なくともほとんど保証します。以下の MSDN からの抜粋を参照してください) 。finally ブロック内で例外をスローすると、その例外によって制御が finally ブロックから離れ、その finally ブロック内の残りのコードは実行されません。

あなたの場合、実行されていない行は、同じfinallyブロックの例外の後に発生しているため、スキップされます。

MSDNから- try-finally :

finallyブロックは、 tryブロックで割り当てられたリソースをクリーンアップしたり、tryブロックで例外が発生した場合でも実行する必要があるコードを実行したりするのに役立ちます。通常、finallyブロックのステートメントは 、通常の実行、breakcontinuegoto、またはreturn ステートメントの実行、または例外の伝播の結果として制御の移動が発生するかどうかに関係なく、制御がtryステートメントを離れたときに実行されます。 tryステートメントから。

処理された例外内で、関連するfinallyブロックが実行されることが保証されます。ただし、例外が未処理の場合、 finallyブロックの実行は、例外アンワインド操作がどのようにトリガーされるかに依存します。これは、コンピューターのセットアップ方法によって異なります。詳細については、「CLR での未処理の例外処理」を参照してください。

注: CLR での未処理の例外処理は、MSDN マガジンの 2008 年 9 月号の記事への参照です。MSDN Magazine の 2008 年以前の号はすべて .chm ファイルとしてのみ提供されており、表示する前にダウンロードする必要があります。

于 2012-06-14T18:59:04.590 に答える
19

これに答える最善の方法は、コードを使用することであり、したがって次の画像を使用することだと思います ここに画像の説明を入力してください

于 2012-06-14T19:15:04.887 に答える
6

そのfinallyブロックで例外がスローされているため、制御が最後のfinallyブロックに落ちます。したがって、「asdf」WriteLine は実行されません。

于 2012-06-14T18:59:30.217 に答える
4

finally(またはcatch)ブロック内でスローされた例外は、そのfinally(またはcatch)ブロックの残りをキャンセルします。

于 2012-06-14T18:59:02.077 に答える
3

エラーは 3 番目の try ブロック内で発生し、対応する finally が実行されます。ただし、これにより、現在の最終的にエラーが発生し、元の try-finally ブロックによってキャッチされます。

于 2012-06-14T19:01:05.477 に答える
1

try ブロックをスローすると、finally ブロックが実行Console.WriteLine("asd");され、外部の try catch に終了するためです。

于 2012-06-14T19:02:22.390 に答える
-1

さまざまなホスト プラットフォームにデプロイされたコードで try-finally ブロックを使用したとき、次のことがわかりました。try ブロックで例外がスローされなかった場合。

一部の Windows プラットフォームは常に finally ブロックを実行し、一部のプラットフォームは finally ブロックを実行しませんでした。

私の finally ブロックには、エラー ログを閉じる命令が含まれており、finally ブロックの実行に失敗すると、終了時に常に別の例外が発生し、エラーの原因を突き止めるために暗号化された情報のみが利用可能になりました。私のアプリケーションの try finally ブロックは、価値があるよりも問題が多かったです。

于 2014-04-15T10:12:35.117 に答える