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.