レッスンに戻る

最後にまたはコードのみですか?

重要度: 5

2つのコードフラグメントを比較してください。

  1. 1番目はfinallyを使用してtry...catch後にコードを実行します。

    try {
      work work
    } catch (err) {
      handle errors
    } finally {
      cleanup the working space
    }
  2. 2番目のフラグメントは、クリーニングをtry...catchの直後に配置します。

    try {
      work work
    } catch (err) {
      handle errors
    }
    
    cleanup the working space

作業後には確実にクリーンアップが必要であり、エラーがあってもなくても関係ありません。

finallyを使用する利点はありますか、それとも両方のコードフラグメントは同じですか?そのような利点がある場合は、問題になる場合の例を挙げてください。

関数内のコードを見ると、その違いが明らかになります。

try...catchから「ジャンプアウト」がある場合は、動作が異なります。

たとえば、try...catch内にreturnがある場合です。finally句は、returnステートメントを介してであっても、try...catchからのあらゆる終了の場合に機能します。try...catchが完了した直後、ただし、呼び出しコードが制御を取得する前です。

function f() {
  try {
    alert('start');
    return "result";
  } catch (err) {
    /// ...
  } finally {
    alert('cleanup!');
  }
}

f(); // cleanup!

…または、ここに示すように、throwがある場合

function f() {
  try {
    alert('start');
    throw new Error("an error");
  } catch (err) {
    // ...
    if("can't handle the error") {
      throw err;
    }

  } finally {
    alert('cleanup!')
  }
}

f(); // cleanup!

ここでクリーンアップを保証するのはfinallyです。fの最後にコードを置くだけでは、このような状況では動作しません。