¿Es posible detectar si se produjo una excepción antes de que ingresara en un bloque final?

En Java, ¿existe una forma elegante de detectar si se produjo una excepción antes de ejecutar el bloque finally? Cuando se trata de sentencias "close ()", es común que se necesite un manejo de excepciones dentro del bloque finally. Idealmente, nos gustaría mantener ambas excepciones y propagarlas hacia arriba (ya que ambas pueden contener información útil). La única forma en la que se me ocurre hacer esto es tener una variable fuera del ámbito try-catch-finally para guardar una referencia a una excepción lanzada. Luego propague la excepción "guardada" hacia arriba con cualquiera que ocurra en el bloque finally.

¿Hay una forma más elegante de hacer esto? Tal vez una llamada a la API que revelará esto?

Aquí hay un código aproximado de lo que estoy hablando:

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, hay una serie de otros kludges similares que podrían implicar guardar la excepción como una variable miembro, devolverla desde un método, etc ... pero estoy buscando algo un poco más elegante.

Tal vez algo comoThread.getPendingException() ¿o algo similar? Para el caso, ¿existe una solución elegante en otros idiomas?

Esta pregunta realmente surgió de los comentarios enotra pregunta que plantea una pregunta interesante.

Respuestas a la pregunta(5)

Su respuesta a la pregunta