0

だから、これについての確認が欲しい。擬似コードで説明します。

public void myFunc() throws Exception{
 Session session = Hibernate.getSession();
 try{
    //do somthing
 } catch(Exception ex){
  throw ex;
 } finally{
  session.close();
 }
}

したがって、try ブロックで例外がスローされた場合、セッションは閉じられません。閉じる前に、プールされた接続のタイムアウトを待つ必要がありますよね? もしそうなら、休止状態で例外をキャッチするためのより良い方法はありますか?

4

1 に答える 1

2

ブロック内のコードFinallyは常に実行されます。Catchそのため、ブロックで例外がスローされたかどうかに関係なく、セッションは閉じられます。kemがコメントで示唆しているように、デバッガーでこのコードをシングルステップで実行してみて、正確な動作を確認する必要があります。


throw exちなみに、元の例外の呼び出しスタックがこのthrowステートメントが実行されるポイントにリセットされるため、 絶対に記述しないでください。その結果、例外が実際に発生した場所に関する関連情報が失われます。代わりに、を使用する必要がありますthrow。または、新しい例外クラスを作成してをに設定することもできますがInnerExceptionexスタックトレースに追加情報を追加する必要がない限り、これは何の役にも立たない余分な作業のようです。

もちろん、上に示したコードは、そもそもなぜ例外をキャッチしているのかという大きな問題も提起します。throwブロック内の例外に単純に書き直したらCatch、そもそも例外をキャッチしないのと同じことです。Catch代わりに、ブロックを完全に省略して、Try-Finallyパターンだけで解決してみませんか?

public void myFunc()
{
    Session session = Hibernate.getSession();
    try
    {
        //do something
    }
    finally
    {
        session.Close();
    }
}

そして、代わりにパターンを実装するようにコードを変更できることを確認したら、Try-Finallyさらに1つ進むことができます。シバン全体を、オブジェクトを自動的に処理するusingステートメントに置き換えてみませんか?

于 2010-12-30T09:43:15.440 に答える