web-dev-qa-db-fra.com

Pourquoi un retour dans "finalement" remplace-t-il "essayer"?

Comment fonctionne une instruction return dans un bloc try/catch?

function example() {
    try {
        return true;
    }
    finally {
        return false;
    }
}

Je m'attends à ce que la sortie de cette fonction soit true, mais à la place c'est false!

77
bonfo

Enfin toujours s'exécute. C'est à cela qu'il sert, ce qui signifie que son retour est utilisé dans votre cas.

Vous voudrez changer votre code pour qu'il ressemble plus à ceci:

function example() { 
    var returnState = false; // initialisation value is really up to the design
    try { 
        returnState = true; 
    } 
    catch {
        returnState = false;
    }
    finally { 
        return returnState; 
    } 
} 

D'une manière générale, vous ne voulez jamais avoir plus d'une instruction de retour dans une fonction, des choses comme celle-ci sont pourquoi.

80
annakata

Selon ECMA-262 (5ed, décembre 2009), aux pp.96:

La production TryStatement : try Block Finally est évalué comme suit:

  1. Soit B le résultat de l'évaluation de Block.
  2. Soit F le résultat de l'évaluation Enfin.
  3. Si F.type est normal, retournez B.
  4. Retour F.

Et à partir de la p. 36:

Le type Achèvement est utilisé pour expliquer le comportement des instructions (break, continue, return et throw) qui effectuent des transferts de contrôle non locaux. Les valeurs du type Achèvement sont des triplets de la forme ((type, valeur, cible), où type est l'un des normal, break , continue, return, ou throw, valeur est n'importe quelle valeur de langage ECMAScript ou vide, et cible est tout Identifiant ECMAScript ou vide.

Il est clair que return false définirait le type de complétion enfin comme retour, ce qui entraînerait try ... finally à faire 4. Retour F.

33
livibetter

Lorsque vous utilisez finally, tout code dans ce bloc se déclenche avant la fin de la méthode. Étant donné que vous utilisez un retour dans le bloc finally, il appelle return false et remplace la précédente return true dans le bloc try.

(La terminologie n'est peut-être pas tout à fait correcte.)

12
djdd87

pourquoi vous devenez faux, c'est que vous êtes revenu dans un bloc enfin. Enfin, le bloc doit toujours s'exécuter. donc votre return true devient return false

function example() {
    try {
        return true;
    }
    catch {
        return false;
    }
}
3
anishMarokey

Pour autant que je sache, le bloc finallytoujours s'exécute, que vous ayez ou non une instruction return dans try. Ergo, vous obtenez la valeur retournée par l'instruction return dans le bloc finally.

J'ai testé cela avec Firefox 3.6.10 et Chrome 6.0.472.63 à la fois dans Ubuntu. Il est possible que ce code se comporte différemment dans d'autres navigateurs.

1
Manoj Govindan

Le bloc enfin réécrit essayer le retour de bloc (au sens figuré).

Je voulais juste souligner que si vous retournez quelque chose de finalement, il sera renvoyé par la fonction. Mais si finalement il n'y a pas de mot "retour" - il sera renvoyé la valeur du bloc try;

function example() {
    try {
        return true;
    }
    finally {
       console.log('finally')
    }
}
console.log(example());
// -> finally
// -> true

Donc -finally- return réécrit le retour de -try- return.

1
Mihey Mik