1. ホーム
  2. c#

[解決済み] catch' ブロックを使わずに 'try-finally' ブロックを使用する

2023-03-22 23:06:46

質問

を使用することが適切な場面はありますか? try-finally ブロックが catch ブロックがない?

どのように解決するのですか?

の後に何らかのアクションが発生するようにするために使うのでしょう。 try コンテンツの後、あるいは例外が発生したとき、しかしその例外を消費したくないときに、あるアクションが発生するようにするために使用します。

はっきりさせておきたいのですが、これは例外を隠すものではありません。その finally ブロックは、例外がコールスタックに伝搬される前に実行されます。

を使うときにもうっかり使ってしまいそうです。 using キーワードを使用した場合、コンパイルされるのは try-finally (にコンパイルされるからです(正確な変換ではありませんが、議論するためには十分近いです)。

try
{
    TrySomeCodeThatMightException();
}
finally
{
    CleanupEvenOnFailure();
}

で動作するコード finally で実行されるコードは実行が保証されませんが、保証されないケースはかなり端的で、覚えていないくらいです。私が覚えているのは、もしあなたがそのようなケースに当てはまるのであれば、を実行しないことが非常に良い可能性であるということだけです。 finally が実行されないことが最大の問題ではない可能性が非常に高いということです :-) ので、基本的に気にしないでください。

Tobiasからのアップデートです。 finally はプロセスが終了すると実行されません。

Paddy からの更新です。 .net の try..finally ブロックで 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();
}