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
の終わりにコードをおいた場合は実行されない場合があります。