最後にまたはコードのみですか?
重要度: 5
2つのコードフラグメントを比較してください。
-
1番目は
finally
を使用してtry...catch
後にコードを実行します。try { work work } catch (err) { handle errors } finally { cleanup the working space }
-
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
の最後にコードを置くだけでは、このような状況では動作しません。