8

2つの条件の違いは何ですか?method1またはmethod2を実行するたびに、実行に必要なコードブロックが必要です。2つの方法は同じように思えます。

// example method1
void Method1(void)
{
    try
    {
        // do something
    }
    catch (Exception ex)
    {
        // do something
    }
    finally
    {
        // do something whenever method1 runs
    }
}

// example method2
void Method2(void)
{
    try
    {
        // do something
    }
    catch (Exception ex)
    {
        // do something
    }

    // do something whenever method2 runs
}

最後に、ブロックは私には不要のようです。

4

7 に答える 7

17

最初の例では、例外を再スローしても、finally内のコードは引き続き実行されます。これは、2番目の例では不可能です。

例外を再スローしないことを選択した場合、はい、ほとんど違いはありません。ただし、これは不正な形式と見なされます。明示的に処理できない例外を消費する必要がある場合はめったにありません。

これは、コードの実行フローを支援するためのキーワードです。例外をスローすると、コードの実行フローが影響を受けます(を使用するなどreturn)。このfinallyキーワードを使用すると、例外が発生した場合(またはreturnからのtry場合)に、実行が終了するときに何かを実行する必要があることを表現できます。

質問に正面から答えるには、必要なときではなく、必要なときに必要です。


参考文献

安全のため、このキーワードの使用を開始する前に、そのドキュメントをお読みください。

http://msdn.microsoft.com/en-us/library/zwc8s4fz.aspx

そして、一般的な例外処理キーワード:

http://msdn.microsoft.com/en-us/library/s7fekhdy.aspx


例外をキャッチして何かを実行してから、再スローします。finally整理されたコードを呼び出すために使用します。

try
{
    OpenConnectionToDatabase();
    // something likely to fail
}
catch (Exception ex)
{
    Log(ex);
    throw;  
    // throw ex; // also works but behaves differently
}
// Not specifying an exception parameter also works, but you don't get exception details.
//catch (Exception)
//{
//    Log("Something went wrong);
//    throw;
//}
finally
{
    CloseConnectionToDatabase();
}

例外をキャッチすることに関心を持たないでください。ただし、finallyコードを整理するために使用してください。

try
{
    OpenConnectionToDatabase();
    // something likely to fail
}
finally
{
    CloseConnectionToDatabase();
}

try見栄えが良いので、から戻ってください。ただし、finallyコードを整理するために使用します。

try
{
    OpenConnectionToDatabase();
    return 42;
}
finally
{
    CloseConnectionToDatabase();
}
于 2012-03-15T09:43:38.930 に答える
2

finallyブロックのコードは、try-catchの後でとにかく実行されます。これは、クリーンアップに非常に役立ちます。

try
{
    // open resources
}
catch (Exception ex)
{
    // something bad happened
}
finally
{
    // close resources that are still opened
}
于 2012-03-15T09:43:32.973 に答える
1

これは、たとえば、あなたがreturnからであるかどうかによって、非常に異なる動作をします。tryまた、-が例外をスローした場合(または元の例外を再スローしたfinally場合)でも実行されます。これは、がないと発生しません。catchfinally

つまり、必須ではありませんが、動作が異なります。したがって、コードを実行したい場合は、に入れてfinallyください。

多くの点で、/tryは/または//finallyよりもはるかに一般的です。trycatchtrycatchfinally

于 2012-03-15T09:44:06.847 に答える
1

ブロックが絶対に必要というわけではありませんが、finallyブロックを持っていると、ブロック内のコードが常に実行されることが保証されます (finally に例外がない限り)。

次の点を考慮してください。

void Method2(void) 
{ 
    try 
    { 
        // do something 
    } 
    catch (Exception ex) 
    { 
        // do something 
        throw;
    } 

    // do something whenever method2 runs 
} 

例外がスローされた場合、の後のコードtry/catchは実行されません。さらに、catchブロック内のコードに例外の原因となるエラー (ロギングが予期しない例外をスローするなど) がある場合、ブロック内にあるはずのコードfinallyは実行されず、残され、クリーンアップが元に戻されます。

また、return文によってそのコードが実行されなくなりますが、finally は引き続き実行されます (また、ここでは、catch もスキップできることがわかり、例外が上に伝播できることがわかります - を実行した後finally):

void Method2(void) 
{ 
    try 
    {  
        // do something
        return
    } 
    finally
    {     
        // do something whenever method2 runs 
    }
} 

メソッドの最後に実行する必要があるクリーンアップ コードがある場合は常に、を使用しますfinally(または、オブジェクトが実装する場合はステートメントをIDisposable使用します)。using

于 2012-03-15T09:52:17.273 に答える
0

finally ブロックは、その中のすべてのコードが常に実行されることを保証するため、try ブロック内にreturnステートメントがあるか、catch ブロック内で例外を再スローした場合、finally ブロック内のコードは常に実行されます。

関係なく何かが起こるようにする必要がある場合は必須です (例: リソースの破棄など)。

于 2012-03-15T09:46:15.690 に答える
0

大きな違いは、try...catch が例外を飲み込み、エラーが発生したという事実を隠していることです。try..finally はクリーンアップ コードを実行し、例外は継続して処理されます。

于 2012-03-15T09:51:08.640 に答える