だから、私はこれについていくつか確認したい。疑似コードで説明します。最終的にクローズする前にhibernateを持つキャッチブロックに例外をスローする
したがって、tryブロックに例外がスローされた場合、セッションは決してクローズされません。終了する前にプールされた接続のタイムアウトを待つ必要がありますか?もしそうなら、休止状態で例外をキャッチする方が良いでしょうか?
だから、私はこれについていくつか確認したい。疑似コードで説明します。最終的にクローズする前にhibernateを持つキャッチブロックに例外をスローする
したがって、tryブロックに例外がスローされた場合、セッションは決してクローズされません。終了する前にプールされた接続のタイムアウトを待つ必要がありますか?もしそうなら、休止状態で例外をキャッチする方が良いでしょうか?
Finally
ブロック内のコードは常に実行されます。したがって、Catch
ブロックに例外がスローされたかどうかにかかわらず、セッションは閉じられます。コメントにkemが示唆しているように、デバッガでこのコードを一歩踏み込んで、自分自身の正確な動作を確認する必要があります。
throw ex
は、元の例外の呼び出しスタックをこのthrow文が実行されるポイントにリセットするため、記述しないでください。その結果、実際に例外が発生した場所に関する関連情報が失われます。代わりに、throw
を使用してください。また、新しい例外クラスを作成してInnerException
をex
に設定することもできますが、スタックトレースに追加情報を追加する必要がない限り、余分な作業は不要です。
もちろん、上に示したコードは、最初に例外をキャッチしている理由の大きな疑問を提起しています。ブロックCatch
ブロックの例外を単にthrow
に書き直すと、例外は最初にキャッチされないのと同じことです。代わりに、Catch
ブロックを完全に省略して、Try-Finally
パターンだけを解決するのはなぜですか?私たちは、コードではなくTry-Finally
パターンを実装するために変更することができることを確立したら
public void myFunc()
{
Session session = Hibernate.getSession();
try
{
//do something
}
finally
{
session.Close();
}
}
そして、我々はさらに、1つを行くことができます。ちょうどあなたが自動的にオブジェクトを処分するのを担うusing
statementにシバン全体を置き換えてみませんか?
Necro comment :)しかし、私はJavaで(C#は異なるかもしれませんが) 'throw ex'は実際に' ex' 'コールスタックを書き換えないことを指摘したいと思います。スタックは、スロー時間ではなく、構築時に例外オブジェクトに格納されます。 –
finallyブロックは、catchブロックから例外を再スローする場合でも実行されます。あなたのデバッガでそれを歩いてください。 – kem