最終的にブロック内にあるものはすべて(ほぼ)常に実行されるので、コードを囲むことと閉じないままにすることの違いは何ですか?
最終的にブロック内にあるものはすべて(ほぼ)常に実行されるので、コードを囲むことと閉じないままにすることの違いは何ですか?
回答:
例外があるかどうかに関係なく、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..catch
tryブロックが例外をスローしたかどうかに関係なく、ブロックの後にコードを実行する機会が保証されています。
これにより、リソース、データベース接続、ファイルハンドルなどの解放などに最適です。
ファイルリーダーの例外を使用して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
ステートメントがあったとしても、節に存在するコードが実行されることは明らかです。