JavaScriptで例外処理!(try, catch, finally)

JavaScript

JavaScriptでtry catchを使って、例外処理を書く方法についてです。
最初にtry catchについて解説して、その次にfinallyについて書いています。

try catchの使い方

try catchを使うと、tryブロックで例外(エラー)が発生したときに、catchブロックで例外を取得して処理することができます。
例えば、下記のように使います。

try {
    noFunction()
} catch(e) {
    console.log("--- output error ---")
    console.log(e.name)
    console.log(e.message)
}

最初にtryを書いています。
このtryからcatchまでの波括弧({})のブロックに、例外(エラー)が発生するかもしれない処理を書きます。

ここでは、存在しないnoFunction関数を呼び出してみました。
そうすると、エラーになるので、catchブロックに遷移します。

e変数でエラーを受けています。ここは任意の名前で大丈夫です。
受け取ったエラーのオブジェクトが代入されます。

最初にメッセージを出力して、catchで受けたことがわかるようにしました。
その後に、それぞれ2つのプロパティにアクセスして、情報を出力しています。

・`e.name`でエラーの名前
・`e.message`でエラーメッセージ

プログラムを実行して、結果を確認すると、下記のように出力されました。

--- output error ---
ReferenceError
noFunction is not defined

エラーが発生したため、catchに遷移してメッセージが出力されました。

e.nameReferenceErrorが出力され、e.messageでエラーメッセージが出力されました。
存在しない関数にアクセスしようとしたため、このエラーになりました。
このようにエラーが発生した場合に、catchの箇所でエラーオブジェクトを受け取って、処理することができます。

エラーがないときにはcatchされない

tryで囲んだブロックにエラーがない場合は、もちろんcatchされません。
例えば、下記の処理は正常に動くため、catchに遷移せずに処理が終わります。

try {
    console.log("処理開始!")
    console.log("hello!!")
} catch(e) {
    console.log("--- output error ---")
    console.log(e.name)
    console.log(e.message)
}
console.log("処理終了!")

プログラムを実行すると、catchの方に移行せず、下記を出力して処理が終わります。

処理開始!
hello!!
処理終了!

finallyの使い方について

try catchを使って処理を書いた際に、finallyを使うことができます。
finallyはtryで例外(エラー)が発生した時でも、しなかった時でも、必ず実行されるブロックです。

例えば、下記のように使うことができます。

try {
    console.log('処理開始!!')
} catch(e) {
    console.log('エラー!!')
    console.log(e.name)
    console.log(e.message)
} finally {
    console.log('終了処理!!')
}

try catchで処理をしている最後にfinallyブロックを追加しました。
これで、try catchでエラーがあった時でも、なかった時でもfinallyブロックに書いた処理が実行されます。

上記のコードのときにはエラーにならないので、出力結果はこのようになります。

処理開始!!
終了処理!!

tryブロックでメッセージが出力された後に、finallyブロックでメッセージが出力されて処理が終わりました。

エラーが発生するとき

下記のようにエラーが発生したときでも、finallyが実行されます。

try {
    console.log('処理開始!!')
    noFunction()
} catch(e) {
    console.log('エラー!!')
    console.log(e.name)
    console.log(e.message)
} finally {
    console.log('終了処理!!')
}

先ほどのプログラムのtryブロックにnoFunctionという定義されていない関数を呼び出しました。
このプログラムを実行すると、下記のようになります。

処理開始!!
エラー!!
ReferenceError
noFunction is not defined
終了処理!!

tryブロックでエラーが出た後に、catchブロックで出力処理を行いました。
そして、最後にfinallyブロックで出力処理が行われています。

このように、エラーがあってもなくてもfinallyブロックは実行されます。

finallyブロックは必要なのか?

finallyブロックがなくても、下記のように処理すれば、正常時でも異常時でも実行する処理が書けそうです。

try {
    console.log('処理開始!!')
    noFunction()
} catch(e) {
    console.log('エラー!!')
    console.log(e.name)
    console.log(e.message)
}
console.log('終了処理!!')

実際、この処理の場合には特に問題なく処理できます。
finallyは、returnが書かれていたときでも実行されるので、このときに効果を発揮します。

try {
    console.log('処理開始!!')
    return
} catch(e) {
    console.log('エラー!!')
    console.log(e.name)
    console.log(e.message)
} finally {
    console.log('終了処理!!')
}

tryブロックにreturnが書いています。
このときにfinallyブロックがあれば、finallyブロック配下の処理を実行してくれます。
finallyブロックがないと、returnで処理が終わってしまいます。

上記のプログラムを実行すると、このように出力されました。

処理開始!!
終了処理!!

returnがあっても、finallyブロックがあれば、このように処理が実行されます。

try catchとfinallyまとめ

今回はJavaScriptで例外処理を書く方法について紹介しました。

記事の内容をまとめると、下記のようになります。

・try catchを使うことで例外処理を書くことができる。
・tryブロックの配下に、例外(エラー)が発生しそうな処理を書く。
・catchブロックに例外(エラー)が発生したときの処理を書く。
・catchブロックは例外(エラー)が発生しないときには処理されない。
・finallyブロックを書いておけば、正常時でも異常時でも処理を実行してくれる。
・finallyブロックに書いた処理は、try catchにreturnが書いてあっても実行される。

コメント

タイトルとURLをコピーしました