Estas são duas coisas diferentes:
- O bloco catch só é executado se uma exceção for lançada no bloco try.
- O bloco finally é executado sempre após o bloco try (-catch), se uma exceção for lançada ou não.
Em seu exemplo, você não mostrou a terceira construção possível:
try {
// try to execute this statements...
}
catch( SpecificException e ) {
// if a specific exception was thrown, handle it here
}
// ... more catches for specific exceptions can come here
catch( Exception e ) {
// if a more general exception was thrown, handle it here
}
finally {
// here you can clean things up afterwards
}
E, como @codeca diz em seu comentário, não há como acessar a exceção dentro do bloco finally, pois o bloco finally é executado mesmo que não haja exceção.
Claro que você pode declarar uma variável que contém a exceção fora do seu bloco e atribuir um valor dentro do bloco catch. Depois disso, você pode acessar essa variável dentro do seu bloco finally.
Throwable throwable = null;
try {
// do some stuff
}
catch( Throwable e ) {
throwable = e;
}
finally {
if( throwable != null ) {
// handle it
}
}
Throwable
dofinally
bloco, porque pode não haver umThrowable
.