J'ai vu un code comme celui-ci:
try
{
db.store(mydata);
}
finally
{
db.cleanup();
}
Je pensais que try
est supposé avoir un catch
?
Pourquoi ce code le fait-il de cette façon?
Cela est utile si vous voulez que la méthode en cours d'exécution lève toujours l'exception tout en permettant de nettoyer les ressources de manière appropriée. Vous trouverez ci-dessous un exemple concret de gestion de l'exception à partir d'une méthode d'appel.
public void yourOtherMethod() {
try {
yourMethod();
} catch (YourException ex) {
// handle exception
}
}
public void yourMethod() throws YourException {
try {
db.store(mydata);
} finally {
db.cleanup();
}
}
C'est là parce que le programmeur voulait s'assurer que db.cleanup()
est appelé même si le code à l'intérieur du bloc try lève une exception. Les exceptions éventuelles ne seront pas gérées par ce bloc, mais elles ne seront propagées que lorsque le dernier bloc sera exécuté.
Pourquoi ce code le fait-il de cette façon?
Parce qu'apparemment, le code ne sait pas comment gérer les exceptions à ce niveau. C'est bon - tant que l'un des appelants le fait, c'est-à-dire tant que l'exception est finalement gérée quelque part.
Souvent, le code de bas niveau ne peut pas réagir correctement aux exceptions car l'utilisateur doit être averti, l'exception doit être journalisée ou une autre stratégie doit être essayée. Le code de bas niveau n’assure que un fonction et ne connaît pas la prise de décision de niveau supérieur.
Mais le code doit encore nettoyer ses ressources (car sinon, elles fuiraient). C’est ce que fait la clause finally
, en veillant à ce que always se produise, qu’une exception soit émise ou ne pas.
Le bloc finally assure que même lorsqu'une exception RuntimeException est levée (peut-être en raison d'un bogue dans le code appelé), l'appel db.cleanup()
sera effectué.
Ceci est également souvent utilisé pour éviter de trop imbriquer:
try
{
if (foo) return false;
//bla ...
return true;
}
finally
{
//clean up
}
En particulier lorsque la méthode renvoie de nombreux points, cela améliore la lisibilité, car tout le monde peut voir que le code de nettoyage est appelé dans tous les cas.
Si l'un des codes du bloc try peut générer une exception contrôlée, il doit apparaître dans la clause throws de la signature de la méthode. Si une exception non vérifiée est renvoyée, elle est extraite de la méthode.
Le bloc finally est toujours exécuté, qu'une exception soit levée ou non.
Le code le fait pour s'assurer que la base de données est fermée.
En général, vous feriez pour placer tout votre code d'accès à la base de données dans le bloc try, puis passer un appel pour fermer la base de données dans le bloc finally.
Le chemin try ... finally fonctionne, signifie que le code du bloc try est exécuté et que le code du bloc finally est exécuté à la fin de son exécution ... peu importe le choix.
À moins que l’ordinateur ne soit retiré du mur, celui-ci s’exécutera enfin.
Cela signifie que même si une exception est appelée et que l’exécution de la méthode prend trois ans, elle restera dans le bloc finally et la base de données sera fermée.