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 c'est le cas false
!
Réponses:
Enfin exécute toujours . 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:
En règle générale, vous ne voulez jamais avoir plus d'une instruction return dans une fonction, ce sont des choses comme celles-ci.
la source
Selon ECMA-262 (5ed, décembre 2009), aux pp.96:
Et à partir des pages 36:
Il est clair que
return false
fixerait le type d'achèvement de finalement comme retour , ce qui causetry ... finally
à faire 4. Retour F .la source
Lorsque vous utilisez
finally
, tout code dans ce bloc se déclenche avant la fin de la méthode. Comme vous utilisez un retour dans lefinally
bloc, il appellereturn false
et remplace le précédentreturn true
dans letry
bloc.(La terminologie n'est peut-être pas tout à fait correcte.)
la source
pourquoi vous obtenez false est que vous êtes retourné dans un bloc finally. Enfin, le bloc doit toujours s'exécuter. donc vos
return true
changements enreturn false
la source
Le bloc finally réécrit try block return (au sens figuré).
Je voulais juste souligner que si vous renvoyez quelque chose de finalement, il sera renvoyé par la fonction. Mais si finalement il n'y a pas de mot «return» - il sera retourné la valeur du bloc try;
Donc -finalement-
return
réécrit le retour de -try-return
.la source
Autant que je sache, le
finally
bloc s'exécute toujours , que vous ayez unereturn
instruction à l'intérieurtry
ou non. Ergo, vous obtenez la valeur renvoyée par l'return
instruction à l'intérieur du bloc finally.J'ai testé cela avec Firefox 3.6.10 et Chrome 6.0.472.63 tous deux dans Ubuntu. Il est possible que ce code se comporte différemment dans d'autres navigateurs.
la source
Je vais donner une réponse légèrement différente ici: Oui, le bloc
try
etfinally
est exécuté etfinally
a la priorité sur la valeur de "retour" réelle d'une fonction. Cependant, ces valeurs de retour ne sont pas toujours utilisées dans votre code.Voici pourquoi:
res.send()
Express.js, qui crée une réponse HTTP et la distribue.try
etfinally
bloc sera à la fois exécuter cette fonction comme ceci:Ce code affichera la chaîne
try
dans votre navigateur. AUSSI, l'exemple montrera une erreur dans votre console. Lares.send()
fonction est appelée deux fois . Cela se produira avec tout ce qui est une fonction. Le bloc try-catch-finally obscurcira ce fait à l'œil non averti, car (personnellement) j'associe uniquement desreturn
valeurs aux portées de fonction.À mon avis, votre meilleur pari est de ne jamais utiliser à l'
return
intérieur d'unfinally
bloc . Cela compliquera trop votre code et masquera potentiellement les erreurs.En fait, il existe une règle d'inspection de code par défaut configurée dans PHPStorm qui donne un "Avertissement" pour ceci:
https://www.jetbrains.com/help/phpstorm/javascript-and-typescript-return-inside-finally-block.html
Alors qu'est-ce que tu utilises
finally
?Je n'utiliserais
finally
que pour nettoyer des trucs. Tout ce qui n'est pas critique pour la valeur de retour d'une fonction.Cela peut avoir du sens si vous y réfléchissez, car lorsque vous dépendez d'une ligne de code sous
finally
, vous supposez qu'il pourrait y avoir des erreurs danstry
oucatch
. Mais ces deux derniers sont les éléments de base de la gestion des erreurs. Utilisez simplement unreturn
intry
et à lacatch
place.la source
Référence: developer.mozilla.org
la source
Enfin est censé s'exécuter TOUJOURS à la fin d'un bloc try catch de sorte que (par spécification) est la raison pour laquelle vous obtenez un faux retourné. Gardez à l'esprit qu'il est tout à fait possible que différents navigateurs aient des implémentations différentes.
la source
Et ça?
la source