レッスンに戻る

Finally or just the code?

重要性: 5

2つのコードの断片を比較してみてください。

  1. 1つ目は try..catch のあとにコードを実行するために finally を使います:

    try {
      work work
    } catch (e) {
      handle errors
    } finally {
      作業場所のクリーンアップ
    }
  2. 2つ目は try..catch の直後にクリーンアップする処理を置きます:

    try {
      work work
    } catch (e) {
      handle errors
    }
    
    作業場所のクリーンアップ

私たちは、処理が開始された後には、それがエラーかどうかは関係なく必ずクリーンアップが必要です。

finally を使うことの利点はあるでしょうか?それとも両方のコードは同じでしょうか?もし利点がある場合はそれが関係する例を挙げてください。

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

もし try..catch の “飛び出し” がある場合、振る舞いは異なります。

例えば、try..catch の中で return がある場合です。finally 句は try..catchどのような終わり方の場合にでも 動作します。たとえ、return 文経由でさえも。

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

f(); // cleanup!

…もしくは次のように throw がある場合:

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

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

f(); // cleanup!

ここで finally はクリーンアップを保証します。もし f の終わりにコードをおいた場合は実行されない場合があります。