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
!
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.
Selon ECMA-262 (5ed, décembre 2009), aux pp.96:
La production
TryStatement : try Block Finally
est évalué comme suit:
- Soit B le résultat de l'évaluation de Block.
- Soit F le résultat de l'évaluation Enfin.
- Si F.type est normal, retournez B.
- Retour F.
Et à partir de la p. 36:
Le type Achèvement est utilisé pour expliquer le comportement des instructions (
break
,continue
,return
etthrow
) 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 desnormal
,break
,continue
,return
, outhrow
, 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.
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.)
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;
}
}
Pour autant que je sache, le bloc finally
toujours 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.
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
.