30

構文は言語によって異なりますが、これは一般的な質問です。

これの違いは何ですか....

try
{
     Console.WriteLine("Executing the try statement.");
     throw new NullReferenceException();
}
catch (NullReferenceException e)
{
     Console.WriteLine("{0} Caught exception #1.", e);
}       
finally
{
     Console.WriteLine("Executing finally block.");
}

この....

try
{
    Console.WriteLine("Executing the try statement.");
    throw new NullReferenceException();
}
catch (NullReferenceException e)
{
    Console.WriteLine("{0} Caught exception #1.", e);
}        
Console.WriteLine("Executing finally block.");

私はそれが使用されているのを見続けているので、最終的に使用する正当な理由があると思いますが、ステートメントの後にコードを配置するのとどう違うのかわかりません.

最終的に実行されないシナリオはありますか?

4

10 に答える 10

38

あなたの例では、大きな違いはありません。

ただし、これを想像してください。

    try
    {
        Console.WriteLine("Executing the try statement.");
        throw new NullReferenceException();
    }
    catch (SomeOtherException e)
    {
        Console.WriteLine("{0} Caught exception #1.", e);
    }       
    finally
    {
        Console.WriteLine("Executing finally block.");
    }

    Console.WriteLine("Executing stuff after try/catch/finally.");

この場合、catchはエラーをキャッチしないため、try/catch/finally 全体の後に到達することはありません。ただし、finally ブロックは引き続き実行されます

于 2013-05-23T02:37:25.983 に答える
13
try
{
    throw new Exception("Error!");
}
catch (Exception ex)
{
    throw new Exception(ex, "Rethrowing!");
}
finally
{
    // Will still run even through the catch kicked us out of the procedure
}

Console.WriteLine("Doesn't execute anymore because catch threw exception");
于 2013-05-23T02:37:42.030 に答える
4

finally ブロックが実行されることが保証されます。したがって、あなたの例では、両方のケースの結果は同じに見えます。returnしかし、catch ブロックでorを使用するthrowと、何が違うのかがわかります。

于 2013-05-23T02:37:52.780 に答える
0

プログラムのクラッシュを処理するために finally を使用することをお勧めします。finally は常に実行されます。関数が try catch ブロック内で終了した場合、または try または catch で別のエラーがスローされた場合でも、finally は引き続き実行されます。finally ステートメントを使用しないと、その機能は得られません。

于 2013-05-23T02:37:13.687 に答える
0

最終的に常に常に実行されます。最終的には、何も逃さないキャッチャーのようなものです。あなたが言及した例では、 yes 最終的に値を追加しません。しかし最後に、通常はリソースを破棄/解放するために使用されます。

于 2013-05-23T04:34:02.987 に答える