2010-12-08 4 views
6

私は最後にブロックをキャッチしようとしましたが、いくつかの例外が発生した場合は、キャッチブロックから戻ってきますので、最終的にブロックはまだ実行されています。返品前​​または返品後?関数からcatchブロックに戻って、最終的にブロックするのはどうしますか?

これは正しい方法ですか?

try 
{ 
// do something 
} 

catch (Exception) 
{  
    return false; 
} 
finally 
{ 
    if (connection.State == ConnectionState.Open) connection.Close(); 
} 
+3

catchの両方の行と最後にブレークポイントを設定していることがわかります。 – RvdK

+0

トリッキーな一......私は知っている! - あなたはそれを実行し、何が起こるか見ることができます。 –

答えて

6

リターン後に "finally"ブロックを実行します。 「最後に」

+0

'using'を使うと最終的には必要ないと思います。 – Dialecticus

+0

usingは、IDisposeableインターフェイスを実装するインスタンスにのみ適用でき、コンパイラはuseブロックを適切なtry ... finallyブロックに変換します。編集:ICioneableをIDisposableに置き換えました。 – Dennis

+0

@Dialectus:これは合理的な前提です。これは、コンパイラが 'finally'ブロックを使って' Dispose'を呼び出す構文的砂糖です。 –

2

finallyブロックが常に実行されます。あなたのケースでは、あなたのreturnステートメントの前に実行されます。

+0

私は最終的にreturn文の後に実行されると思いますが、実行が呼び出される関数に戻る前に考えます。 return - > finally - >戻る。 – Dialecticus

+0

Debbugerは、最初にstatementをfinallyブロックに戻します。しかし、プログラムはfinallyブロックに最初に行き、メソッドを離れると終了します。だから私は合理的に、finallyブロックがreturn(メソッドを残す)ステートメントの前に実行されると言うことができます。 – Nicolas

+5

C#言語仕様は、1)return文の式が評価され、2)finallyブロックが実行されます(これは、囲む 'try-finally'に対して繰り返されます)ブロック)、3)制御が発呼者に戻される。したがって、 'finally'は' return'ステートメントが評価された後に*実行されますが、* before *コントロールが呼び出し元に返されます。 –

1

(必ず実行する必要があり)などに近い、データベース接続など、いくつかの練習のために使用されているあなたは、あなた自身で

private bool test() 
    { 
     try 
     { 
      int i = 0; 
      int u = 10/i; 
     } 

     catch (Exception) 
     { 
      return false; 
     } 
     finally 
     { 

     } 
     return true; 
    } 

を試すことができますので、dividebyゼロ例外です。このコードを実行すると、最後に実行され、その後に戻り値が実行されます。

ランタイムのようなものですが、最終的にブロックの場合の返された結果!

0

finallyブロックはtry-catch-finallyブロックを終了する前に常に実行されます(finallyブロックの実行を妨げるThreadAbortExceptionのような条件は、コードがtry-catch-finallyブロックを終了しないようにします)。

関連する問題