最終的にブロック内にあるものはすべて(ほぼ)常に実行されるので、コードを囲むことと閉じないままにすることの違いは何ですか?
最終的にブロック内にあるものはすべて(ほぼ)常に実行されるので、コードを囲むことと閉じないままにすることの違いは何ですか?
回答:
例外があるかどうかに関係なく、finallyブロック内のコードが実行されます。これは、接続を閉じるように常に実行する必要がある特定のハウスキーピング機能に関しては非常に便利です。
今、私は推測しますが、この操作を行う必要がありますなぜ、あなたの質問は次のとおりです。
try
{
    doSomething();
}
catch
{
    catchSomething();
}
finally
{
    alwaysDoThis();
}
あなたがこれを行うことができるとき:
try
{
    doSomething();
}
catch
{
    catchSomething();
}
alwaysDoThis();
答えは、多くの場合、catchステートメント内のコードが例外を再スローするか、現在の関数から抜け出すことです。後者のコードでは、「alwaysDoThis();」catchステートメント内のコードがreturnを発行するか、新しい例外をスローした場合、呼び出しは実行されません。
try-finallyを使用することのほとんどの利点はすでに指摘されていますが、私はこれを追加すると思いました:
try
{
    // Code here that might throw an exception...
    if (arbitraryCondition)
    {
        return true;
    }
    // Code here that might throw an exception...
}
finally
{
    // Code here gets executed regardless of whether "return true;" was called within the try block (i.e. regardless of the value of arbitraryCondition).
}
この動作は、さまざまな状況で、特にクリーンアップ(リソースの破棄)を実行する必要がある場合に非常に役立ちますが、この場合はブロックを使用する方がよい場合がよくあります。
ストリームリーダー、dbリクエストなどのアンマネージコードリクエストを使用するときはいつでも。例外をキャッチし、try catchを使用して、最後にストリーム、データリーダーなどを閉じます。エラーが発生したときに接続が閉じられない場合、これはdbリクエストでは非常に悪いです。
 SqlConnection myConn = new SqlConnection("Connectionstring");
        try
        {
            myConn.Open();
            //make na DB Request                
        }
        catch (Exception DBException)
        {
            //do somehting with exception
        }
        finally
        {
           myConn.Close();
           myConn.Dispose();
        }
エラーをキャッチしたくない場合は、
 using (SqlConnection myConn = new SqlConnection("Connectionstring"))
        {
            myConn.Open();
            //make na DB Request
            myConn.Close();
        }
エラーが発生した場合、接続オブジェクトは自動的に破棄されますが、エラーはキャプチャされません
最後に、ステートメントは戻った後でも実行できます。
private int myfun()
{
    int a = 100; //any number
    int b = 0;
    try
    {
        a = (5 / b);
        return a;
    }
    catch (Exception ex)
    {
        Response.Write(ex.Message);
        return a;
    }
 //   Response.Write("Statement after return before finally");  -->this will give error "Syntax error, 'try' expected"
    finally
    {
      Response.Write("Statement after return in finally"); // --> This will execute , even after having return code above
    } 
    Response.Write("Statement after return after finally");  // -->Unreachable code
}
    finally、のように:
try {
  // do something risky
} catch (Exception ex) {
  // handle an exception
} finally {
  // do any required cleanup
}
try..catchtryブロックが例外をスローしたかどうかに関係なく、ブロックの後にコードを実行する機会が保証されています。
これにより、リソース、データベース接続、ファイルハンドルなどの解放などに最適です。
ファイルリーダーの例外を使用してfinallyの使用法を説明します例
try{
  StreamReader strReader = new StreamReader(@"C:\Ariven\Project\Data.txt");
  Console.WriteLine(strReader.ReadeToEnd());
  StreamReader.Close();
}
catch (Exception ex)
{
  Console.WriteLine(ex.Message);
}
場合は、上記の例では、ファイルと呼ばれるDATA.TXTが不足している、例外がスローされ、処理されますが、声明と呼ばれるが、StreamReader.Close();実行されることはありません。
このため、リーダーに関連するリソースはリリースされませんでした。
StreamReader strReader = null;
try{
    strReader = new StreamReader(@"C:\Ariven\Project\Data.txt");
    Console.WriteLine(strReader.ReadeToEnd());
}
catch (Exception ex){
    Console.WriteLine(ex.Message);
}
finally{
    if (strReader != null){
        StreamReader.Close();
    }
}
ハッピーコーディング:)
注: 「@」は、「認識されないエスケープシーケンス」のエラーを回避するために、逐語的な文字列を作成するために使用されます。@記号は、その文字列を文字通りに読み取ることを意味し、それ以外の場合は制御文字を解釈しません。
例外(catchブロックなし)を処理したくないが、クリーンアップコードを実行したい場合があります。
例えば:
try
{
    // exception (or not)
}
finally
{
    // clean up always
}
    finishブロックは、tryブロックに割り当てられたリソースをクリーンアップしたり、例外が発生した場合でも実行する必要のあるコードを実行したりするのに役立ちます。tryブロックの終了方法に関係なく、制御は常にfinallyブロックに渡されます。
catchとfinallyを一緒に使用する一般的な使用法は、tryブロックでリソースを取得して使用し、catchブロックで例外的な状況に対処し、finallyブロックでリソースを解放することです。
これを読むことも価値があります、それは述べています:
一致するcatch句が見つかると、システムは制御をcatch句の最初のステートメントに移す準備をします。catch句の実行が始まる前に、システムはまず、例外をキャッチしたものよりもネストされたtryステートメントに関連付けられたfinally句を順番に実行します。
したがってfinally、前のcatch節にreturnステートメントがあったとしても、節に存在するコードが実行されることは明らかです。