É possível detectar se uma exceção ocorreu antes de entrar em um bloco finally?

Em Java, existe uma maneira elegante de detectar se uma exceção ocorreu antes de executar o bloco finally? Ao lidar com instruções "close ()", é comum precisar de manipulação de exceção dentro do bloco finally. Idealmente, queremos manter as duas exceções e propagá-las (já que ambas podem conter informações úteis). A única maneira que posso pensar em fazer isso é ter uma variável fora do escopo try-catch-finally para salvar uma referência a uma exceção lançada. Em seguida, propague a exceção "salva" com qualquer um que ocorra no bloco finally.

Existe uma maneira mais elegante de fazer isso? Talvez uma chamada da API que revele isso?

Aqui está um código aproximado do que estou falando:

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
}

Obviamente, há uma série de outros kludges similares que podem envolver salvar a exceção como uma variável de membro, retornando-a de um método, etc ... mas estou procurando algo um pouco mais elegante.

Talvez algo comoThread.getPendingException() ou algo similar? Aliás, existe uma solução elegante em outros idiomas?

Esta questão realmente surgiu a partir de comentários emoutra pergunta isso levantou uma questão interessante.

questionAnswers(5)

yourAnswerToTheQuestion