【とらいきゃっち】

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

💡 「まずやってみて、失敗したらこうする」の安全ネット
📌 このページのポイント
try-catch — エラーを捕まえて安全に処理する try(試す) 処理1: データを取得 処理2: エラー発生! 処理3: 実行されない 例外を投げる catch(捕まえる) エラー内容をログ出力 ユーザーにエラー通知 finally(必ず実行) リソース解放・後片付け try-catchなし エラーでプログラムが停止 ユーザーに真っ白な画面... try-catchあり エラーを適切に処理して続行 「エラーが発生しました」と表示
try-catch例外処理のフロー図
ひよこ ひよこ

try-catchって具体的にどう書くの?

ペンギン先生 ペンギン先生

try { 危険な処理 } catch (error) { エラー時の処理 } という構文。たとえばJSON.parse()で不正な文字列を渡すとエラーになるけど、try-catchで囲めばエラーメッセージを表示して処理を続けられる。

ひよこ ひよこ

finally って必要なの?

ペンギン先生 ペンギン先生

ファイルを開いたら成功でも失敗でも必ず閉じたい、ローディング表示を必ず消したい、といった「何があっても必ず実行したい後片付け」に使う。なくても動くけど、リソースのクリーンアップに重宝する。

ひよこ ひよこ

非同期処理のエラーってtry-catchで捕まえられる?

ペンギン先生 ペンギン先生

async/await を使っていればtry-catchでOK。Promiseを直接使っているなら .catch() メソッドで捕まえる。コールバックスタイルの場合はtry-catchでは捕まえられないので、コールバック引数でエラーを受け取る。

ひよこ ひよこ

エラーを全部catchしちゃえば安全なの?

ペンギン先生 ペンギン先生

逆に危険だよ。広すぎるcatchは「問題を隠してしまう」から、本来修正すべきバグが見逃される。catch(e) { /* 何もしない */ }は最悪のパターンで「例外の握りつぶし」と呼ばれる。catchするなら「何のエラーを・どう処理するか」を明確にして、想定外のエラーは上位に投げ直すのが原則だよ。

ひよこ ひよこ

Goには try-catch がないって聞いたけど、どうやってエラー処理するの?

ペンギン先生 ペンギン先生

Goは関数の戻り値でエラーを返す方式を採用しているよ。「result, err := doSomething()」のように、2つ目の戻り値でエラーを受け取って「if err != nil」でチェックする。try-catchより冗長だけど、エラー処理が明示的で見落としにくい。RustのResult型も同じ思想で、例外を使わずにエラーを型で表現する。言語設計者の「例外は制御フローを見えにくくする」という哲学が反映されているんだよ。

ペンギン
まとめ:ざっくりこれだけ覚えればOK!
try-catchって出てきたら「エラーが出ても止まらないように受け止める構文」と思えばだいたいOK!
📖 おまけ:英語の意味
「try-catch」 = 試す・捕まえる
💬 「try(やってみる)」して例外が起きたら「catch(捕まえる)」するという直感的な名前
← 用語集にもどる