web-dev-qa-db-fra.com

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?

106
glanden

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();
    }
}
155
Taylor Leese

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

67
Matti Virkkunen

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.

20
Konrad Rudolph

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.

2
FRotthowe

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.

0
THINESH VASEE

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. 

0
chustar