ブロック内のコードFinally
は常に実行されます。Catch
そのため、ブロックで例外がスローされたかどうかに関係なく、セッションは閉じられます。kemがコメントで示唆しているように、デバッガーでこのコードをシングルステップで実行してみて、正確な動作を確認する必要があります。
throw ex
ちなみに、元の例外の呼び出しスタックがこのthrowステートメントが実行されるポイントにリセットされるため、
絶対に記述しないでください。その結果、例外が実際に発生した場所に関する関連情報が失われます。代わりに、を使用する必要がありますthrow
。または、新しい例外クラスを作成してをに設定することもできますがInnerException
、ex
スタックトレースに追加情報を追加する必要がない限り、これは何の役にも立たない余分な作業のようです。
もちろん、上に示したコードは、そもそもなぜ例外をキャッチしているのかという大きな問題も提起します。throw
ブロック内の例外に単純に書き直したらCatch
、そもそも例外をキャッチしないのと同じことです。Catch
代わりに、ブロックを完全に省略して、Try-Finally
パターンだけで解決してみませんか?
public void myFunc()
{
Session session = Hibernate.getSession();
try
{
//do something
}
finally
{
session.Close();
}
}
そして、代わりにパターンを実装するようにコードを変更できることを確認したら、Try-Finally
さらに1つ進むことができます。シバン全体を、オブジェクトを自動的に処理するusing
ステートメントに置き換えてみませんか?