Estos son dos cosas diferentes:
- El bloque catch sólo se ejecuta si se produce una excepción en el bloque try.
- El bloque finally se ejecuta siempre después del bloque try (-catch), si se lanza una excepción o no.
En su ejemplo que no han mostrado la tercera construcción posible:
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
}
Y, como @codeca dice en su comentario, no hay manera de acceder a la excepción dentro del bloque finally, porque el bloque finally se ejecuta incluso si no hay excepción.
Por supuesto, puede declarar una variable que contiene la excepción fuera de su bloque y asignar un valor dentro del bloque catch. Luego puedes acceder a esta variable dentro de tu bloque finally.
Throwable throwable = null;
try {
// do some stuff
}
catch(Throwable e) {
throwable = e;
}
finally {
if(throwable != null) {
// handle it
}
}
Un corolario de esto es que usted no puede * * Acceso a la '' Throwable' del bloque finally', porque no puede ser que no se * * un 'Throwable'. –