149 votes

Est-il judicieux de "essayer-finalement" sans "attraper"?

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?

219voto

Taylor Leese Points 18895

Cela est utile si vous souhaitez 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();
    }
}
 

89voto

Matti Virkkunen Points 31633

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. Toutes les exceptions ne seront pas gérées par ce bloc, mais elles ne seront propagées que lorsque le dernier bloc sera exécuté.

21voto

Konrad Rudolph Points 231505

Pourquoi ce code ne il de cette façon?

Apparemment parce que le code ne sait pas comment gérer les exceptions à ce niveau. C'est très bien , tant que l'une des parties n', c'est à dire aussi longtemps que l'exception est finalement traitée quelque part.

Souvent, au code de bas niveau ne peut pas réagir de façon appropriée à des exceptions, car l'utilisateur doit être notifié, ou de l'exception doit être enregistré, ou une autre stratégie doit être essayé. Faible niveau de code effectue une fonction uniquement et ne connaît pas de plus haut niveau de prise de décision.

Mais le code doit toujours nettoyer ses ressources (parce que si ça ne marche pas, ils seraient en fuite), de sorte qu'il n'est juste que dans l' finally de la clause, en veillant à toujours se produit, si une exception a été levée ou non.

3voto

FRotthowe Points 2914

Le bloc finally garantit 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.

0voto

chustar Points 3720

Le code est fait pour s'assurer que la base de données est fermée.
Généralement, la façon dont vous devez faire c'est de mettre toute votre base de données, l'accès à code dans le bloc try, et puis mettre un appel pour fermer la base de données dans le bloc finally.
Le chemin, essayer...enfin œuvres, signifie que le code dans le bloc try est exécuté, et le code dans le bloc finally est exécuté lorsque cela se termine...n'importe quoi.
Court de l'ordinateur d'arrachement du mur, enfin à exécuter.
Cela signifie que même si une exception est appelé, et la méthode prend trois ans pour l'exécuter, il pourra toujours aller dans le bloc finally et la base de données sera fermé.

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