【とらいきゃっち】

try-catch(例外処理) とは?

最終更新:
💡 例外を受け止め、回復・通知・再送出を選ぶ

try内で投げられた例外をcatchで受け止める構文。ここではJavaScriptを例に、捕捉できる範囲、awaitするPromiseの拒否、finallyでの後片付けを説明します。すべての失敗が自動で回復するわけではありません。

📌 このページのポイント
try-catch:例外を受け止めるtry:処理を実行JSON.parse(text) など例外なし例外ありcatchを飛ばす通常の経路catchで扱うこの例は通知して通常終了finally:後片付け構文全体を抜ける前に実行この例では、構文の後へ継続return・再送出・強制終了は別の条件
JavaScriptでcatchとfinallyが通常終了する例です。捕捉は原因の解消や変更の取消しを保証しません。Promiseの拒否はtry内のawaitなど、その処理に合う扱いが必要です。
ひよこ ひよこ
try-catchは何をする?
ペンギン先生 ペンギン先生
tryの実行中に例外が投げられると、残りのtryの処理を飛ばしてcatchへ移る構文だよ。JavaScriptならtry { JSON.parse(text); } catch (error) { ... }のように書ける。不正なJSONを受け止めても、どう知らせるか、終了するか、代わりの値を使うかは自分で決めるんだ。
ひよこ ひよこ
catchにはエラーオブジェクトが来る?
ペンギン先生 ペンギン先生
JavaScriptではErrorがよく使われるけれど、文字列など別の値をthrowすることもできる。だからerror.messageが必ずあるとは限らないよ。想定した例外だけ回復し、扱えない例外はthrow errorで再送出するなど、捕捉の範囲と方針を明確にするんだ。
ひよこ ひよこ
非同期の失敗も捕まえられる?
ペンギン先生 ペンギン先生
try内でPromiseをawaitして、そのPromiseが拒否されればcatchで受け止められるよ。awaitせず非同期処理を開始しただけだと、後からの拒否をそのtryが捕まえるわけではない。タイマーなどで後から動くコールバックも、その実行箇所やAPIに合うエラー処理が必要なんだ。
ひよこ ひよこ
finallyは何のため?
ペンギン先生 ペンギン先生
tryやcatchを抜ける前に後片付けをするためだよ。通常の実行では成功でも例外でも、returnしようとした場合もfinallyへ進む。ただしプロセスの強制終了などに耐える保証とは別。finallyにreturnやthrowを書くと、元の結果や例外を置き換えることがあるので注意するんだ。
ひよこ ひよこ
catchしたら続けてよい?
ペンギン先生 ペンギン先生
回復できると確認した場合に限るよ。捕捉しても、すでに送ったデータや変更済みの状態が自動で元へ戻るわけではない。記録・通知・再送出や、トランザクションによる取消しなどを必要に応じて設計する。単に何もせず捕捉するだけでは、失敗が見えなくなることがあるんだ。
もっと詳しく知りたい人へ

catchが終われば必ず次の行へ進む?

catchやfinallyでreturnすれば関数を抜け、throwすれば例外が上位へ伝わります。finallyのreturnは、tryで投げられた例外さえ置き換えることがあります。図の継続は、catchとfinallyを通常どおり終える場合の例です。

ペンギン
まとめ:ざっくりこれだけ覚えればOK!
「try-catch」って出てきたら「実行中に起きた例外を捕まえて処理する仕組み」と思えばだいたいOK!
📖 おまけ:英語の意味
「try / catch / finally」 = 試す / 捕まえる / 最後の処理
💬 複数の言語に似た構文がありますが、捕捉の型や非同期処理、資源管理の仕様は言語ごとに異なります。このページの具体例はJavaScriptです。

参考資料

← 用語集にもどる