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