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.message`でエラーメッセージ
プログラムを実行して、結果を確認すると、下記のように出力されました。
--- output error ---
ReferenceError
noFunction is not defined
エラーが発生したため、catchに遷移してメッセージが出力されました。
e.name
でReferenceError
が出力され、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ブロックに例外(エラー)が発生したときの処理を書く。
・catchブロックは例外(エラー)が発生しないときには処理されない。
・finallyブロックを書いておけば、正常時でも異常時でも処理を実行してくれる。
・finallyブロックに書いた処理は、try catchにreturnが書いてあっても実行される。
コメント