あなたはそれの後にいくつかの行動が起こるのを確実にするためにそれを使うでしょうtry
コンテンツまたは例外が発生したが、その例外を消費したくない場合
明確にするために、これは例外を隠しません。のfinally
例外がコールスタックに伝播される前にblockが実行されます。
あなたが使用するときにも誤ってそれを使用するだろうusing
これはキーワードにコンパイルされるためです。try-finally
(正確な変換ではありませんが、議論のためにそれは十分に近いです)。
try
{
TrySomeCodeThatMightException();
}
finally
{
CleanupEvenOnFailure();
}
で実行中のコードfinally
実行することは保証されていませんが、それが保証されていない場合はかなり縁があります - それを思い出すことすらできません。私が覚えているのは、あなたがそのような場合であれば、可能性は非常に高いです。finally
あなたの最大の問題ではありません:-)だから基本的には汗をかいてはいけません。
Tobiasから更新:
finally
プロセスが強制終了されると実行されません。
水田からの更新: 最後に.net try..finallyブロックで実行されない条件
最もよく見られる例は、コードが失敗してもデータベース接続または外部リソースを破棄することです。
using (var conn = new SqlConnection("")) // Ignore the fact we likely use ORM ;-)
{
// Do stuff.
}
にコンパイル何か好きです:
SqlConnection conn;
try
{
conn = new SqlConnection("");
// Do stuff.
}
finally
{
if (conn != null)
conn.Dispose();
}
using
同等ですtry-finally
。あなただけが使用しますtry-finally
中を片付けたいときfinally
そして例外を気にしないでください。
の最善のアプローチになります
try
{
using(resource)
{
//Do something here
}
}catch(Exception)
{
//Handle Error
}
そうすることによってさえ呼ばれた一掃using
失敗しても、コードは失敗しません。
ときにいくつかの条件がありますfinally
実行されません。
StackOverflowException
またはExecutingEngineException
。これがあなたの疑問に答えることを願っています。
たとえば、自分で作成してtryブロックで使用するアンマネージリソースがある場合は、finallyブロックを使用してそのリソースを確実に解放できます。 finallyブロックは、tryブロック内で発生したこと(例外など)にかかわらず、常に実行されます。
例えば。 lock(x)ステートメントは本当に
System.Threading.Monitor.Enter(x);
try { ... }
finally
{
System.Threading.Monitor.Exit(x);
}
finallyブロックは、排他ロックが解除されていることを確認するために常に呼び出されます。
コードを使用したわかりやすい説明:
void MyMethod1()
{
try
{
MyMethod2();
MyMethod3();
}
catch(Exception e)
{
//do something with the exception
}
}
void MyMethod2()
{
try
{
//perform actions that need cleaning up
}
finally
{
//clean up
}
}
void MyMethod3()
{
//do something
}
MyMethod2またはMyMethod3のいずれかが例外をスローした場合は、MyMethod1によってキャッチされます。しかし、MyMethod2のコードはクリーンアップコードを実行する必要があります。例外がMyMethod1に渡される前に、データベース接続を閉じます。
どの例外がキャッチされたとしても、あるいは何もキャッチされなかったとしても、ブロックが終了する前に何らかのコードを実行したい場合は、finallyブロックが必要です。たとえば、開いているファイルを閉じることができます。
参照やってみる
/ finally:例外を処理したくないが、呼び出されたコードによって例外がスローされたかどうかにかかわらず、何らかのアクションを確実に実行したい場合。
次のリンクを見てください。https://softwareengineering.stackexchange.com/questions/131397/why-use-try-finally-without-a-catch-clause
それはあなたのアプリケーションのアーキテクチャとあなたがそのブロックで実行している操作に依存します。
これは、やっとtryを使用したい状況です。通常usingステートメントを使用しますが、リフレクションによってメソッドを呼び出しているため使用できません。
これはうまくいきません
using (objMsg = Activator.CreateInstance(TypeAssist.GetTypeFromTypeName("omApp.MessagingBO")))
{
}
代わりに使う
object objMsg = null;
try
{
objMsg
= Activator.CreateInstance(TypeAssist.GetTypeFromTypeName("myAssembly.objBO"));
strResponse = (string)objMsg.GetType().InvokeMember("MyMethod", BindingFlags.Public
| BindingFlags.Instance | BindingFlags.InvokeMethod, null, objMsg,
new object[] { vxmlRequest.OuterXml });
}
finally
{
if (objMsg!=null)
((IDisposable)objMsg).Dispose();
}
これは私がいつも(ええと..)使うユースケースです:
int? x; //note the nullable type here!
try
{
x = int.Parse(someString);
}
catch { } //don't care, let it just be null
1.我々はcatchなしでtryブロックを使うことができますが、最後にcatch /を使うべきです。 それらのどれでも。 2. try blockだけは使えません。
try
そしてfinally
"としてやってみる ステートメント」 - DavidRR