4

コードの簡単な部分、いくつかの基本try-finallyブロックについて簡単な質問があります。

try {
  // Some code which can throw an Exception
} finally {
  // Some code which also can throw an Exception
}

私の主な質問は次のとおりです。ブロック間で情報を渡すために、いくつかのローカル変数をfinally使用せずにブロックで例外がスローされることを発見できる方法はありますか?catch

catchこれが役立つ状況はほとんどありません。変数を設定するためだけに、醜い不要なブロックを追加したくありませんthrow Exception。最初の例は、Springまたはコンテナー管理のトランザクションメソッドを使用していて、tryブロックExceptionが発生した場合です。finallyその場合、データベースを操作するために新しいトランザクションを作成する必要があります。2番目の例は、ブロックにスローされてオリジナルExceptionがマスクされたくない場合ですが、存在しない場合は、(存在する場合は)スローします。ExceptionfinallyExceptionfinally

私はそれがすべてできることを知っていますcatchが、他の方法、Javaのメタデータまたは他の何かがありますか?また、これが1つで実行されると想定できる場合は役立つ可能性があるThreadため、現在の例外に制限されている例外を検出する方法があるかもしれませんThread

4

3 に答える 3

6

それは長い間私を苛立たせてきたものです。

私は通常、変数exceptionThrown = trueを先頭で宣言し、戻る直前にfalseに設定します。次に、finallyハンドラーでそれをテストできます。後者のアプローチはスタックトレースを台無しにするので、キャッチして再スローするよりも良いと思います。

JavaもC#もこれを処理するためのより良い方法を持っていないことに私は驚いています

于 2013-03-08T08:44:36.810 に答える
3

Java 7 を使用している場合は、try-with-resourceが役立つかもしれません。

finallyトランザクションのクローズを処理できるため、ブロックは必要ありません。catch次に、例外処理コード (新しいトランザクションの作成など) をブロックに入れることができます。最後に、tryブロックから例外がスローされ、リソースを解放するときにも例外がスローされる場合、トランザクションを閉じたときにスローされた例外をtry呼び出すことで、例外を使用できます。Throwable.getSuppressed

于 2013-03-08T08:53:34.607 に答える
2

可能であれば、新しい自動リソース管理機能を使用することをお勧めします。

http://docs.oracle.com/javase/tutorial/essential/exceptions/tryResourceClose.html

Java 7 では、Throwable も「抑制された例外」で強化されました。

http://docs.oracle.com/javase/tutorial/essential/exceptions/tryResourceClose.html#suppressed-exceptions

于 2013-03-08T08:48:27.713 に答える