web-dev-qa-db-ja.com

try .. catch .. finallyによるJavascriptエラー処理

私はfinallyブロックを間違って使用しており、その目的の基本を理解していないという疑いがあります...

 function myFunc() {
      try {
           if (true) {
                throw "An error";
           }
      } catch (e) {
           alert (e);
           return false;
      } finally {
           return true;
      }
 }

この関数はcatchブロックを実行し、「エラー」を警告しますが、trueを返します。なぜfalseを返さないのですか?

55
nickf

Finallyブロックには、tryブロックとcatchブロックの実行後、try ... catchステートメントに続くステートメントの前に実行するステートメントが含まれています。 finallyブロックは、例外がスローされるかどうかに関係なく実行されます。例外がスローされると、catchブロックが例外を処理しなくても、finallyブロックのステートメントが実行されます。 詳細

finallyブロックは常に実行されます。trueブロックの後にtryを返してみてください

function myFunc() {
     try {
         if (true) {
               throw "An error";
          }
          return true;
     } catch (e) {
          alert (e);
          return false;
     } finally {
          //do cleanup, etc here
     }
 }
83
Gilean

Tryブロックを離れると、最後にブロックが実行されます。これは、コードでfalseを返すときに発生します。これは戻り値をfalseに設定し、関数を終了しようとします。しかし、最初にtryブロックを終了して、finallyをトリガーし、戻り値をtrueに上書きする必要があります。

多くの人は、関数ごとに単一のreturnステートメントを使用するのが良いプログラミング手法であると考えています。関数の先頭でvar retvalを作成し、関数全体で適切にtrueまたはfalseに設定してから、コードを構造化して、最後に1回戻るまで正しく終了することを検討してください。

10
Alan Oursland
function getTheFinallyBlockPoint(someValue) {
    var result;
    try {
        if (someValue === 1) {
            throw new Error("Don't you know that '1' is not an option here?");
        }
        result = someValue
    } catch (e) {
        console.log(e.toString());
        throw e;
    } finally {
        console.log("I'll write this no matter what!!!");
    }

    return result;
};

getTheFinallyBlockPoint("I wrote this only because 'someValue' was not 1!!!");
getTheFinallyBlockPoint(1);

ブラウザのコンソールでこれを実行すると、探している答えが得られる場合があります。

1
Danny Mor