127

try / catchブロック内のreturnステートメントはどのように機能しますか?

function example() {
    try {
        return true;
    }
    finally {
        return false;
    }
}

この関数の出力はであると期待していますがtrue、代わりにfalse

4

10 に答える 10

116

最後に常に実行します。それが目的です。つまり、その戻り値があなたのケースで使用されます。

次のようにコードを変更する必要があります。

function example() { 
    var returnState = false; // initialization value is really up to the design
    try { 
        returnState = true; 
    } 
    catch {
        returnState = false;
    }
    finally { 
        return returnState; 
    } 
} 

一般的に言って、関数に複数のreturnステートメントを含めたくない場合は、このようなことが理由です。

于 2010-10-01T09:45:35.060 に答える
50

ECMA-262(5ed、2009年12月)によると、96ページ:

生産TryStatement : try Block Finallyは次のように評価されます。

  1. BをBlockの評価結果とします。
  2. FをFinallyの評価結果とします。
  3. F.typeが正常な場合は、Bを返します。
  4. Fを返します。

そして36ページから:

Completionタイプは、制御の非ローカル転送を実行するステートメント(、、、および)の動作を説明するために使用されbreakます。Completionタイプの値は、(type、value、target)の形式のトリプルです。ここで、type、、、、、、またはのいずれかであり、value任意のECMAScript言語値または空であり、targetは任意のECMAScript識別子または空です。continuereturnthrownormalbreakcontinuereturnthrow

最終的にreturn false完了タイプをreturnとして設定することは明らかであり、これにより4が実行されます。ReturnFtry ... finally

于 2010-10-01T09:56:49.817 に答える
18

を使用するfinallyと、そのブロック内のコードは、メソッドが終了する前に起動します。ブロックでreturnを使用しているため、ブロック内の前のreturnをfinally呼び出しreturn falseてオーバーライドします。return truetry

(用語が正しくない場合があります。)

于 2010-10-01T09:42:42.117 に答える
7

最後にブロックを書き換えて、ブロックリターンを試行します(比喩的に言えば)。

最後に何かを返すと、関数から返されることを指摘したいと思います。しかし、最終的に「return」という単語がない場合は、tryブロックから値が返されます。

function example() {
    try {
        return true;
    }
    finally {
       console.log('finally')
    }
}
console.log(example());
// -> finally
// -> true

したがって、-finally-returnは-try-の戻り値を書き換えreturnます。

于 2019-03-19T08:45:21.360 に答える
4

ここで少し異なる答えを出します。はい、tryfinallyブロックの両方が実行されfinally、関数の実際の「戻り」値よりも優先されます。ただし、これらの戻り値がコードで常に使用されるとは限りません。

理由は次のとおりです。

  • 以下の例ではres.send()、Express.jsから使用します。これは、HTTP応答を作成し、それをディスパッチします。
  • あなたtryfinallyブロックは両方とも次のようにこの関数を実行します:
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値を関数スコープに関連付けるだけだからです。

私の最善の策は、ブロック内で決して使用returnfinallyしないことです。コードが複雑になり、エラーがマスクされる可能性があります。

実際、PHPStormにはデフォルトのコード検査ルールが設定されており、これに対して「警告」が表示されます。

https://www.jetbrains.com/help/phpstorm/javascript-and-typescript-return-inside-finally-block.html

それで、あなたは何のために使いますfinallyか?

私はfinallyものを片付けるためだけに使うでしょう。関数の戻り値にとって重要ではないもの。

について考えると、それは理にかなっているかもしれません。なぜなら、の下のコード行に依存している場合、またはfinallyにエラーがある可能性があると想定しているからです。ただし、最後の2つは、エラー処理の実際の構成要素です。代わりにinとを使用してください。trycatchreturntrycatch

于 2020-06-25T22:16:25.087 に答える
3

falseになる理由は、finallyブロックで返されるためです。最後に、ブロックは常に実行する必要があります。だからあなたのreturn true変更はreturn false

function example() {
    try {
        return true;
    }
    catch {
        return false;
    }
}
于 2010-10-01T09:43:33.397 に答える
1

私の知る限り、内部にステートメントがあるかどうかに関係なく、finallyブロックは常に実行されます。エルゴ、finallyブロック内のステートメントによって返される値を取得します。returntryreturn

私はこれをFirefox3.6.10とChrome6.0.472.63の両方でUbuntuでテストしました。このコードは、他のブラウザでは動作が異なる可能性があります。

于 2010-10-01T09:43:22.197 に答える
1

ついにブロックから戻る

-blockが値を返す場合、および-block内のステートメントに関係なく finally、この値がステートメント全体の戻り値になります。try-catch-finallyreturntrycatch

参照:developer.mozilla.org

于 2020-03-14T16:52:08.547 に答える
-2

最後に、常にtry catchブロックの最後で実行することになっているため、(仕様により)falseが返されます。ブラウザが異なれば実装も異なる可能性があることに注意してください。

于 2010-10-01T09:43:56.337 に答える
-3

これはどうですか?

doubleReturn();

function doubleReturn() {
  let sex = 'boy';

  try {
    return sex;

    console.log('this never gets called...');
  } catch (e) {} finally {
    sex = 'girl'; 

    alert(sex);
  }
}
于 2018-06-28T20:38:06.030 に答える