【えらーはんどりんぐ】

エラーハンドリング とは?

最終更新:
💡 失敗に気づき、次の対処を決める

プログラムの失敗を検知し、内容に応じて回復・通知・記録・上位への伝達などの対処を行うこと。例外を捕まえても、必ず処理を続行できるとは限らない。

📌 このページのポイント
失敗時の対処と共通の後処理 try:入力を読むJSON.parse(text)正常:結果を使う例外がなければcatch:失敗に対処入力の修正を促す正常例外finally:共通の後処理「処理中」の表示を解除catchで扱えても、成功とは別
JavaScriptの入力処理の例。catchはtry内の例外があるときだけ実行します。finallyの後に続行するか、戻るか、例外を伝えるかは処理内容によります。
ひよこ ひよこ
エラーを捕まえたら、必ず動き続けられる?
ペンギン先生 ペンギン先生
捕まえた後に何をするかによるよ。たとえば入力したJSONが不正なら、JavaScriptのcatchで修正を促せる。ただしcatchでも例外を投げることがあるし、そこで回復できない失敗を上位へ伝える場合もあるんだ。
ひよこ ひよこ
全部のエラーを無視すれば止まらない?
ペンギン先生 ペンギン先生
空のcatchで無視すると、失敗を見落とすよ。そこで対処できる失敗には必要な処理を行い、対処できないものは再びthrowするなどして伝えよう。捕まえたことを、成功したこととして扱わないのが大切だね。
ひよこ ひよこ
後片付けはcatchに書くの?
ペンギン先生 ペンギン先生
成功時にも必要な後処理なら、finallyに置けるよ。tryからそのまま出る場合も、catchを通る場合も実行される。ただしfinallyのreturnやthrowは、それまでの戻り値や例外を上書きすることがあるので注意しよう。
ひよこ ひよこ
通信のような非同期処理もtryで囲めばいい?
ペンギン先生 ペンギン先生
Promiseを返す関数を呼ぶだけでは、後から起きた拒否をそのtry-catchで捕まえられないよ。async関数内ならtryの中でawaitして拒否を例外として扱うか、返されたPromiseに.catch()を付ける方法があるんだ。
ひよこ ひよこ
Result型って何が違うの?
ペンギン先生 ペンギン先生
RustのResultは、成功の値をOk、失敗の情報をErrに入れた戻り値だよ。呼び出し側はそれを見て対処を分けたり、失敗を上位へ返したりする。例外を捕まえる方法だけがエラーハンドリングではないんだ。
ペンギン
まとめ:ざっくりこれだけ覚えればOK!
「エラーハンドリング」って出てきたら「失敗を検知して対処を決めること」と思えばだいたいOK!
📖 おまけ:英語の意味
「error handling」 = エラーの取り扱い
💬 handle は「扱う・処理する」という意味で、発生したエラーにどう対処するかの仕組み

参考資料

← 用語集にもどる