JavaScript: エラー処理 try, catch, finally
概略
エラーを考慮していない単純なプログラムでは TypeError などのエラーが発生すると後の処理は行われず、 プログラムはそのまま終了してしまいます。
アプリケーションプログラムではエラーが発生した場合でも終了させず、 処理を継続したい場合があります。 このようなときに try, catch, finally を使います。
主な用途は
- エラーが発生した場合でもプログラムを終了させない。
処理の呼び出し元へのエラー通知を止める (throw しない)。エラー終了させない。 - エラーが発生した場合の対応処理を行う。
catch 内で処理します。エラーメッセージの表示など。 - エラーが有無に関係なく必要な後始末処理を行う。
finally 内で処理します。
try, catch, finally の構文
try { // 本体の処理 } catch(e){ // try {} の中でエラーが発生すると catch(){} 内の処理に移ります。 // 引数 e は Error のオブジェクトです。 } finally { // try や catch の処理の後に行われる処理。 // 本体の処理が正常に終了した場合でもエラーが発生した場合でも // 必ず finally {} の中の処理が行われます。 }
- TestJS_try_catch01.html
try, catch, finally のサンプル。 存在しない関数を呼んでエラーを発生させ、エラーメッセージを表示します。
JavaScript: デバッグの仕方 (1)
finally の処理
finaly {} の処理はエラーの有無に関係なく必ず実行されます。 try {} 内や catch {} 内に return がある場合でも 実行されます。 ストリームのクローズ、リソースの解放、通信の終了など エラーの有無に関係なく必要な後始末処理は finally に書きます。
- TestJS_try_catch02.html
finally のサンプル。
エラーの詳細情報: Error.stack
エラーが発生した場所などの詳細情報は Error.stack で見ることができます。
- TestJS_try_catch_Error01.html
Error.stack を表示するサンプル。
- Error.prototype.stack
Error.stack は標準の関数ではないので Web ブラウザによって表示内容が変わります。 Firefox の場合は行の情報 (スタックトレース) のみ出力され、 最初のエラー原因の行が含まれていません。 Edge と Chrome は 2023年頃は共通です。
サンプル
- TestJS_codetest_append01.html
テストプログラムの実行結果を表示するサンプル。 実行エラーが発生したときに catch してエラーの内容も表示する。
テストプログラムの実行とソース表示 - TestJS_codetest_currentScript01.html
上のサンプルを簡素化したもの。
エラーを発生させる: throw Error
プログラムで自発的にエラーを発生させる (エラーを投げる、 スローすると言います) 場合に使用します。
// 例: 値をチェックする処理。 // value が数値でない場合は Error を投げる if (typeof(value) != "number"){ throw new Error(`set myProperty:${value}`); }
- TestJS_class_property01.html
class のプロパティと setter/getter のサンプル。 パラメータに問題がある場合に Error を投げる例。
JavaScript: クラス (class) (1)