Autant que je sache, les deux extraits de code suivants serviront le même but. Pourquoi avoir finally
blocs?
Code A:
try { /* Some code */ }
catch { /* Exception handling code */ }
finally { /* Cleanup code */ }
Code B:
try { /* Some code */ }
catch { /* Exception handling code */ }
// Cleanup code
Throwable
...)Un bloc finally
s'assure que cependant vous quittez ce bloc (quelques manières d'abandonner explicitement l'ensemble du processus), il sera exécuté. C'est important pour le nettoyage déterministe des ressources.
Notez que (du moins en Java, probablement aussi en C #), il est également possible d’avoir un bloc try
sans catch
, mais avec un finally
. Lorsqu'une exception se produit dans le bloc try
, le code du bloc finally
est exécuté avant que l'exception ne soit levée plus haut:
InputStream in = new FileInputStream("somefile.xyz");
try {
somethingThatMightThrowAnException();
}
finally {
// cleanup here
in.close();
}
Vous voudrez peut-être mettre le code que vous voulez quand même être exécuté indépendamment de ce qui se passe dans votre bloc try ou catch.
De même, si vous utilisez plusieurs catch et si vous voulez mettre du code commun à tous les blocs catch, vous pouvez le placer, mais vous ne pouvez pas être sûr que tout le code de try a été exécuté.
Par exemple:
conn c1 = new connection();
try {
c1.dosomething();
} catch (ExceptionA exa) {
handleexA();
//c1.close();
} catch (ExceptionB exb) {
handleexB();
//c1.close();
} finally {
c1.close();
}
Enfin toujours toujours exécuté, où votre code après la capture peut ne pas.
Même si notre application est fermée de manière forcée, certaines tâches doivent être exécutées (telles que la libération de la mémoire, la fermeture de la base de données, le verrouillage de la libération, etc.), si vous écrivez ces lignes de code dans le bloc finally
, elles seront exécutées si une exception est levée. ou pas...
Votre application peut être un ensemble de threads, Exception
met fin au thread mais pas à l'ensemble de l'application. Dans ce cas, finally
est plus utile.
Dans certains cas, finally
ne sera pas exécuté, tel que JVM Fail, Thread se termine, etc.
Parce que vous avez besoin que ce code soit exécuté quelles que soient les exceptions pouvant être levées. Par exemple, vous devrez peut-être nettoyer une ressource non gérée (la construction 'using' compile en un bloc try/finally).
enfin, block en Java peut être utilisé pour insérer du code de "nettoyage" tel que la fermeture d'un fichier, la fermeture d'une connexion, etc.
Le bloc finally ne sera pas exécuté si le programme se termine (soit en appelant System.exit (), soit en provoquant une erreur fatale entraînant l’abandon du processus).
Si catch block lève une exception, le code restant ne sera pas exécuté et nous devrons écrire finalement block.
finally
TOUJOURS est exécuté, sauf si la machine virtuelle est arrêtée, finally
fournit simplement une méthode pour placer le code de nettoyage à un endroit.
Il serait trop fastidieux de mettre le code de nettoyage dans chacun des blocs catch
.
Il peut y avoir des moments où vous voulez exécuter un morceau de code, peu importe quoi. Qu'une exception soit levée ou non. Ensuite, on utilise finally
.