35 votes

Quel est l'intérêt du bloc enfin?

Mis à part la syntaxe, quelle est la différence entre

 try {
}
catch() {
}
finally {
    x = 3;
}
 

et

 try {
}
catch() {
}

x = 3;
 

modifier: dans .NET 2.0?


donc

 try {
    throw something maybe
    x = 3
}
catch (...) {
    x = 3
}
 

est comportementalement équivalent?

44voto

Josh Hinman Points 4064

Eh bien, pour une chose, si vous RETOURNEZ à l'intérieur de votre bloc try, le finalement fonctionnera toujours, mais le code listé ci-dessous le bloc try-catch-finally ne le sera pas.

36voto

Vinko Vrsalovic Points 116138

Dépend du langage car il peut y avoir de légères différences sémantiques, mais l'idée est qu'il s'exécutera (presque) toujours, même si le code du bloc try a levé une exception.

Dans le deuxième exemple, si le code du bloc catch retourne ou se ferme, le x = 3 ne sera pas exécuté. Dans le premier, ce sera le cas.

Dans la plate-forme .NET, dans certains cas, l'exécution du bloc finally ne se produira pas: exceptions de sécurité, suspensions de thread, arrêt de l'ordinateur :), etc.

10voto

SCdF Points 11397

En Java:

Enfin, est toujours appelé, que l'exception soit correctement interceptée dans catch (), ou en fait si vous avez un catch du tout.

9voto

bibix Points 1915

essayez d'attraper enfin est très important de construire. Vous pouvez être sûr que, même si une exception est levée, le code dans le bloc finally sera exécuté. Il est très important pour la manipulation de ressources externes en vue de leur libération. La collecte des ordures ne pas le faire pour vous. En enfin, la partie que vous ne devriez pas avoir de retour de déclarations ou de lancer des exceptions. Il est possible de le faire, mais c'est une mauvaise pratique et peut conduire à des résultats imprévisibles.

Si vous essayez cet exemple:

try {
  return 0;
} finally {
  return 2;
}

Le résultat sera 2:)

Comparaison avec d'autres langues: Retour De Enfin

6voto

wvdschel Points 6111

Plusieurs éléments rendent un bloc enfin utile:

  1. Si vous revenez des blocs try ou catch, le bloc finally est toujours exécuté, juste avant que le contrôle ne soit rendu à la fonction appelante
  2. Si une exception se produit dans le bloc catch ou si un type d'exception non intercepté se produit dans le bloc try, le code dans le bloc finally est toujours exécuté.

Ceux-ci font enfin des blocs excellents pour fermer les poignées de fichiers ou les sockets.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X