Finally or just the code?
重要性: 5
2つのコードの断片を比較してみてください。
-
1つ目は
try..catch
のあとにコードを実行するためにfinally
を使います:try { work work } catch (e) { handle errors } finally { 作業場所のクリーンアップ }
-
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
の終わりにコードをおいた場合は実行されない場合があります。