Wie funktioniert eine return-Anweisung in einem try / catch-Block?
function example() {
try {
return true;
}
finally {
return false;
}
}
Ich erwarte die Ausgabe dieser Funktion true
, aber stattdessen ist es false
!
Antworten:
Endlich immer ausgeführt. Dafür ist es da, was bedeutet, dass die Rückgabe in Ihrem Fall verwendet wird.
Sie möchten Ihren Code so ändern, dass er eher so aussieht:
Im Allgemeinen möchten Sie nie mehr als eine return-Anweisung in einer Funktion haben. Solche Dinge sind der Grund dafür.
quelle
Gemäß ECMA-262 (5ed, Dezember 2009), S. 96:
Und ab S. 36:
Es ist klar , dass
return false
Vollendung Art gesetzt würde schließlich als Rückkehr , die dazu führen ,try ... finally
zu tun 4. Rückkehr F .quelle
Wenn Sie verwenden
finally
, wird jeder Code in diesem Block ausgelöst, bevor die Methode beendet wird. Da Sie imfinally
Block eine Rückgabe verwenden , wirdreturn false
die vorherigereturn true
imtry
Block aufgerufen und überschrieben .(Die Terminologie ist möglicherweise nicht ganz richtig.)
quelle
Warum Sie falsch werden, ist, dass Sie in einem finally-Block zurückgegeben werden. Schließlich sollte Block immer ausgeführt werden. also deine
return true
änderungen anreturn false
quelle
Die endgültigen Blockumschreibungen versuchen die Blockrückgabe (im übertragenen Sinne).
Ich wollte nur darauf hinweisen, dass, wenn Sie etwas von endlich zurückgeben, es von der Funktion zurückgegeben wird. Wenn es jedoch endlich kein 'return'-Wort gibt, wird der Wert vom try-Block zurückgegeben.
Also
return
schreibt -end- die Rückkehr von -try- neureturn
.quelle
Soweit ich weiß, wird der
finally
Block immer ausgeführt, unabhängig davon, ob Sie einereturn
Anweisung enthaltentry
oder nicht. Ergo erhalten Sie den vom zurückgegebenen Wertreturn
Anweisung im finally-Block zurückgegeben wird.Ich habe dies mit Firefox 3.6.10 und Chrome 6.0.472.63 in Ubuntu getestet. Es ist möglich, dass sich dieser Code in anderen Browsern anders verhält.
quelle
Referenz: developer.mozilla.org
quelle
Ich werde hier eine etwas andere Antwort geben: Ja, sowohl der
try
als auch derfinally
Block werden ausgeführt und habenfinally
Vorrang vor dem tatsächlichen "Rückgabewert" für eine Funktion. Diese Rückgabewerte werden jedoch nicht immer in Ihrem Code verwendet.Hier ist der Grund:
res.send()
Express.js verwendet, das eine HTTP-Antwort erstellt und diese versendet.try
und Ihrfinally
Block führen diese Funktion folgendermaßen aus:Dieser Code zeigt die Zeichenfolge
try
in Ihrem Browser an. AUCH das Beispiel zeigt einen Fehler in Ihrer Konsole. Dieres.send()
Funktion wird zweimal aufgerufen . Dies geschieht mit allem, was eine Funktion ist. Der Try-Catch-finally-Block wird diese Tatsache für das ungeübte Auge verschleiern, weil ich (persönlich) nur assoziierereturn
Werte nur mit Funktionsbereichen .Imho ist Ihre beste Wette, nie
return
innerhalb einesfinally
Blocks zu verwenden . Dies wird Ihren Code überkomplizieren und möglicherweise Fehler maskieren.Tatsächlich gibt es in PHPStorm eine Standard-Code-Inspektionsregel, die eine "Warnung" dafür gibt:
https://www.jetbrains.com/help/phpstorm/javascript-and-typescript-return-inside-finally-block.html
Also, wofür benutzt du
finally
?ich würde ... benutzen
finally
nur Sachen aufräumen. Alles, was für den Rückgabewert einer Funktion nicht kritisch ist.Es kann sinnvoll sein, wenn Sie darüber nachdenken, denn wenn Sie von einer Codezeile unter abhängen
finally
, gehen Sie davon aus, dass es Fehler intry
oder geben könntecatch
. Die letzten beiden sind jedoch die eigentlichen Bausteine für die Fehlerbehandlung. Verwenden Sie stattdessen einfach einreturn
Intry
undcatch
.quelle
Schließlich soll IMMER am Ende eines try catch-Blocks ausgeführt werden, damit (nach Angabe) falsch zurückgegeben wird. Beachten Sie, dass es durchaus möglich ist, dass verschiedene Browser unterschiedliche Implementierungen haben.
quelle
Was ist damit?
quelle