Czy można wykryć, czy wystąpił wyjątek przed wprowadzeniem bloku wreszcie?

Czy w Javie istnieje elegancki sposób wykrywania, czy wystąpił wyjątek przed uruchomieniem bloku finally? Gdy mamy do czynienia z instrukcjami „close ()”, często trzeba obsługiwać wyjątki w bloku finally. Idealnie byłoby, gdybyśmy chcieli zachować oba wyjątki i propagować je (ponieważ oba mogą zawierać przydatne informacje). Jedynym sposobem na zrobienie tego jest posiadanie zmiennej poza zakresem try-catch-finally, aby zapisać odwołanie do rzuconego wyjątku. Następnie rozpropaguj „zapisany” wyjątek z dowolnym, który wystąpi w bloku finally.

Czy jest to bardziej elegancki sposób? Być może wywołanie API, które to ujawni?

Oto krótki kod tego, o czym mówię:

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
}

Oczywiście istnieje wiele innych podobnych kludgów, które mogą obejmować zapisywanie wyjątku jako zmiennej składowej, zwracanie go z metody itp. ... ale szukam czegoś bardziej eleganckiego.

Może coś w tym styluThread.getPendingException() czy coś podobnego? Jeśli o to chodzi, czy istnieje eleganckie rozwiązanie w innych językach?

To pytanie zrodziło się z komentarzy winne pytanie to wzbudziło interesujące pytanie.

questionAnswers(5)

yourAnswerToTheQuestion