try / catchブロック内のreturnステートメントはどのように機能しますか?
function example() {
try {
return true;
}
finally {
return false;
}
}
この関数の出力はであると期待していますがtrue
、代わりにfalse
!
try / catchブロック内のreturnステートメントはどのように機能しますか?
function example() {
try {
return true;
}
finally {
return false;
}
}
この関数の出力はであると期待していますがtrue
、代わりにfalse
!
最後に常に実行します。それが目的です。つまり、その戻り値があなたのケースで使用されます。
次のようにコードを変更する必要があります。
function example() {
var returnState = false; // initialization value is really up to the design
try {
returnState = true;
}
catch {
returnState = false;
}
finally {
return returnState;
}
}
一般的に言って、関数に複数のreturnステートメントを含めたくない場合は、このようなことが理由です。
ECMA-262(5ed、2009年12月)によると、96ページ:
生産
TryStatement : try Block Finally
は次のように評価されます。
- BをBlockの評価結果とします。
- FをFinallyの評価結果とします。
- F.typeが正常な場合は、Bを返します。
- Fを返します。
そして36ページから:
Completionタイプは、制御の非ローカル転送を実行するステートメント(、、、および)の動作を説明するために使用され
break
ます。Completionタイプの値は、(type、value、target)の形式のトリプルです。ここで、typeは、、、、、、またはのいずれかであり、valueは任意のECMAScript言語値または空であり、targetは任意のECMAScript識別子または空です。continue
return
throw
normal
break
continue
return
throw
最終的にreturn false
完了タイプをreturnとして設定することは明らかであり、これにより4が実行されます。ReturnF。try ... finally
を使用するfinally
と、そのブロック内のコードは、メソッドが終了する前に起動します。ブロックでreturnを使用しているため、ブロック内の前のreturnをfinally
呼び出しreturn false
てオーバーライドします。return true
try
(用語が正しくない場合があります。)
最後にブロックを書き換えて、ブロックリターンを試行します(比喩的に言えば)。
最後に何かを返すと、関数から返されることを指摘したいと思います。しかし、最終的に「return」という単語がない場合は、tryブロックから値が返されます。
function example() {
try {
return true;
}
finally {
console.log('finally')
}
}
console.log(example());
// -> finally
// -> true
したがって、-finally-return
は-try-の戻り値を書き換えreturn
ます。
ここで少し異なる答えを出します。はい、try
とfinally
ブロックの両方が実行されfinally
、関数の実際の「戻り」値よりも優先されます。ただし、これらの戻り値がコードで常に使用されるとは限りません。
理由は次のとおりです。
res.send()
、Express.jsから使用します。これは、HTTP応答を作成し、それをディスパッチします。try
とfinally
ブロックは両方とも次のようにこの関数を実行します:try {
// Get DB records etc.
return res.send('try');
} catch(e) {
// log errors
} finally {
return res.send('finally');
}
このコードはtry
、ブラウザに文字列を表示します。また、この例では、コンソールにエラーが表示されます。res.send()
関数は2回呼び出されます。これは、関数であるすべてのもので発生します。try-catch-finallyブロックは、この事実を訓練されていない目にわかりにくくします。これは、(個人的に)return
値を関数スコープに関連付けるだけだからです。
私の最善の策は、ブロック内で決して使用return
finally
しないことです。コードが複雑になり、エラーがマスクされる可能性があります。
実際、PHPStormにはデフォルトのコード検査ルールが設定されており、これに対して「警告」が表示されます。
https://www.jetbrains.com/help/phpstorm/javascript-and-typescript-return-inside-finally-block.html
finally
か?私はfinally
ものを片付けるためだけに使うでしょう。関数の戻り値にとって重要ではないもの。
について考えると、それは理にかなっているかもしれません。なぜなら、の下のコード行に依存している場合、またはfinally
にエラーがある可能性があると想定しているからです。ただし、最後の2つは、エラー処理の実際の構成要素です。代わりにinとを使用してください。try
catch
return
try
catch
falseになる理由は、finallyブロックで返されるためです。最後に、ブロックは常に実行する必要があります。だからあなたのreturn true
変更はreturn false
function example() {
try {
return true;
}
catch {
return false;
}
}
私の知る限り、内部にステートメントがあるかどうかに関係なく、finally
ブロックは常に実行されます。エルゴ、finallyブロック内のステートメントによって返される値を取得します。return
try
return
私はこれをFirefox3.6.10とChrome6.0.472.63の両方でUbuntuでテストしました。このコードは、他のブラウザでは動作が異なる可能性があります。
ついにブロックから戻る
-blockが値を返す場合、および-block内のステートメントに関係なく
finally
、この値がステートメント全体の戻り値になります。try-catch-finally
return
try
catch
最後に、常にtry catchブロックの最後で実行することになっているため、(仕様により)falseが返されます。ブラウザが異なれば実装も異なる可能性があることに注意してください。
これはどうですか?
doubleReturn();
function doubleReturn() {
let sex = 'boy';
try {
return sex;
console.log('this never gets called...');
} catch (e) {} finally {
sex = 'girl';
alert(sex);
}
}