Javaでは、finallyブロックを実行する前に例外が発生したかどうかを検出するための洗練された方法はありますか?「close()」ステートメントを処理する場合、finallyブロック内で例外処理が必要になるのが一般的です。理想的には、両方の例外を維持し、それらを伝播する必要があります(両方に有用な情報が含まれている可能性があるため)。これを行うために私が考えることができる唯一の方法は、try-catch-finallyスコープの外に変数を設定して、スローされた例外への参照を保存することです。次に、「保存された」例外を、finallyブロックで発生する例外とともに伝播します。
これを行うためのよりエレガントな方法はありますか?おそらくこれを明らかにするAPI呼び出しですか?
これが私が話していることのいくつかの大まかなコードです:
Throwable t = null;
try {
stream.write(buffer);
} catch(IOException e) {
t = e; //Need to save this exception for finally
throw e;
} finally {
try {
stream.close(); //may throw exception
} catch(IOException e) {
//Is there something better than saving the exception from the exception block?
if(t!=null) {
//propagate the read exception as the "cause"--not great, but you see what I mean.
throw new IOException("Could not close in finally block: " + e.getMessage(),t);
} else {
throw e; //just pass it up
}
}//end close
}
明らかに、例外をメンバー変数として保存したり、メソッドから返したりするなど、他にも同様の問題がいくつかありますが、もう少しエレガントなものを探しています。
多分何かのようなThread.getPendingException()
ものか似たようなものですか?さらに言えば、他の言語でエレガントな解決策はありますか?
この質問は、興味深い質問を提起した別の質問のコメントから実際に生まれました。