Ce sont deux choses différentes:
- Le bloc catch n'est exécuté que si une exception est levée dans le bloc try.
- Le bloc finally est exécuté toujours après le bloc try (-catch), si une exception est levée ou non.
Dans votre exemple, vous n'avez pas montré la troisième construction possible:
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
}
Et, comme le dit @codeca dans son commentaire, il n'y a aucun moyen d'accéder à l'exception à l'intérieur du bloc finally, car le bloc finally est exécuté même s'il n'y a pas d'exception.
Bien sûr, vous pouvez déclarer une variable qui contient l'exception en dehors de votre bloc et attribuer une valeur à l'intérieur du bloc catch. Ensuite, vous pouvez accéder à cette variable dans votre bloc finally.
Throwable throwable = null;
try {
// do some stuff
}
catch( Throwable e ) {
throwable = e;
}
finally {
if( throwable != null ) {
// handle it
}
}
Throwable
dufinally
bloc, car il pourrait ne pas être unThrowable
.