2010-12-30 1 views
0

だから、私はこれについていくつか確認したい。疑似コードで説明します。最終的にクローズする前にhibernateを持つキャッチブロックに例外をスローする

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

+1

finallyブロックは、catchブロックから例外を再スローする場合でも実行されます。あなたのデバッガでそれを歩いてください。 – kem

答えて

2

Finallyブロック内のコードは常に実行されます。したがって、Catchブロックに例外がスローされたかどうかにかかわらず、セッションは閉じられます。コメントにkemが示唆しているように、デバッガでこのコードを一歩踏み込んで、自分自身の正確な動作を確認する必要があります。

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

もちろん、上に示したコードは、最初に例外をキャッチしている理由の大きな疑問を提起しています。ブロックCatchブロックの例外を単にthrowに書き直すと、例外は最初にキャッチされないのと同じことです。代わりに、Catchブロックを完全に省略して、Try-Finallyパターンだけを解決するのはなぜですか?私たちは、コードではなくTry-Finallyパターンを実装するために変更することができることを確立したら

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

そして、我々はさらに、1つを行くことができます。ちょうどあなたが自動的にオブジェクトを処分するのを担うusing statementにシバン全体を置き換えてみませんか?

+0

Necro comment :)しかし、私はJavaで(C#は異なるかもしれませんが) 'throw ex'は実際に' ex' 'コールスタックを書き換えないことを指摘したいと思います。スタックは、スロー時間ではなく、構築時に例外オブジェクトに格納されます。 –

関連する問題