web-dev-qa-db-fra.com

Pourquoi utilisons-nous enfin des blocs?

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
72
Mohammad Nadeem
  • Que se passe-t-il si une exception que vous ne gérez pas est levée? (J'espère que vous n'attrapez pas Throwable...)
  • Que se passe-t-il si vous revenez de l'intérieur du bloc try?
  • Que se passe-t-il si le bloc catch lève une exception?

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.

124
Jon Skeet

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();
}
9
Jesper

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();
}
7
Balaji Natesan

Enfin toujours toujours exécuté, où votre code après la capture peut ne pas.

5
Sruly

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.

2
Sandy09

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).

1
Ed S.

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).

0
Aakersh Sharma

Si catch block lève une exception, le code restant ne sera pas exécuté et nous devrons écrire finalement block.

0
Reshma Kore

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.

0
Mahmoud Hossam

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.

0
Egalitarian