Sto facendo alcune operazioni di pulizia che potrebbero generare un'eccezione e voglio implementare la logica di un blocco finally
, ma solo se non vengono lanciate eccezioni:
L'implementazione iniziale è questa:
acquireResource();
try {
// stuff
}
catch (Exception e) {
cleanupFromException(e);
throw e;
}
finally {
cleanupTidy();
}
Tuttavia, se viene lanciata un'eccezione, chiamerà cleanupFromException
, quindi cleanupTidy
(che è ciò che non voglio).
Quindi la mia prossima implementazione è questa:
acquireResource();
try {
// stuff
cleanupTidy();
}
catch (Exception e) {
cleanupFromException(e);
throw e;
}
Tuttavia, questo non chiamerà cleanupTidy
se il codice nel blocco try
esegue salti - return
, continue
, break
, ecc - all'esterno del blocco try.
Il meglio che riesco a trovare è questo:
acquireResource();
boolean exceptionThrown = false;
try {
// stuff
}
catch (Exception e) {
exceptionThrown = true;
cleanupFromException(e);
throw e;
}
finally {
if (!exceptionThrown)
cleanupTidy();
}
Ma questo ha un odore un po 'sdolcinato, ed è un sacco di piatti. C'è un modo migliore di avere un finally
che viene eseguito solo se non viene lanciata un'eccezione (in Java)? O un modo di avvolgerlo in un'API più semplice?