web-dev-qa-db-fra.com

Gestion des erreurs Javascript avec try .. catch .. enfin

Je soupçonne que j'utilise incorrectement le bloc finally et que je ne comprends pas les principes fondamentaux de son objectif ...

 function myFunc() {
      try {
           if (true) {
                throw "An error";
           }
      } catch (e) {
           alert (e);
           return false;
      } finally {
           return true;
      }
 }

Cette fonction exécutera le bloc catch, alertera "An error", mais retournera true. Pourquoi ne revient-il pas faux?

55
nickf

Le bloc finally contient des instructions à exécuter après l'exécution des blocs try et catch mais avant les instructions qui suivent l'instruction try ... catch. Le bloc finally s'exécute, qu'une exception soit levée ou non. Si une exception est levée, les instructions du bloc finally s'exécutent même si aucun bloc catch ne gère l'exception. plus

Le bloc finally s'exécutera toujours, essayez de renvoyer true après votre bloc try

function myFunc() {
     try {
         if (true) {
               throw "An error";
          }
          return true;
     } catch (e) {
          alert (e);
          return false;
     } finally {
          //do cleanup, etc here
     }
 }
83
Gilean

Enfin, les blocs s'exécutent lorsque vous quittez le bloc try. Dans votre code, cela se produit lorsque vous retournez false. Cela définit la valeur de retour sur false et tente de quitter la fonction. Mais il doit d'abord quitter le bloc try qui déclenche le finalement et écrase la valeur de retour sur true.

Il est considéré par beaucoup comme une bonne pratique de programmation d'avoir une seule déclaration de retour par fonction. Envisagez de faire un var retval au début de votre fonction et de le définir sur true ou false comme approprié dans toute votre fonction, puis de structurer le code afin qu'il passe correctement à un seul retour en bas.

10
Alan Oursland
function getTheFinallyBlockPoint(someValue) {
    var result;
    try {
        if (someValue === 1) {
            throw new Error("Don't you know that '1' is not an option here?");
        }
        result = someValue
    } catch (e) {
        console.log(e.toString());
        throw e;
    } finally {
        console.log("I'll write this no matter what!!!");
    }

    return result;
};

getTheFinallyBlockPoint("I wrote this only because 'someValue' was not 1!!!");
getTheFinallyBlockPoint(1);

Exécutez cela sur la console de votre navigateur et cela pourrait vous donner la réponse que vous recherchez.

1
Danny Mor