例外の握りつぶし — catchして何もしない
空のcatchがなぜ最悪のデバッグ地獄を生むのかが分かる。原因の見えない不具合の温床を、記録・再送出・回復の3択でふさげるようになる。
- 例外の握りつぶしは、catchでエラーを捕まえた後に何もしない(または握りつぶして先へ進む)こと。エラーが起きた事実そのものが消える。
- 最悪なのは、症状が別の場所で遅れて現れること。nullが後段で例外になったり、保存したはずのデータが消えたりし、本当の原因までたどれない。
- 捕まえたら必ず何かする。記録する(ログ)・呼び出し元へ伝える(再送出)・意味のある回復をする。握りつぶしてよいのは、無視して問題ないと説明できるときだけ。
try で囲んで、catch は空。あるいはエラーを受け取って、そのまま何事もなかったように先へ進む。動いているように見えて、実は最悪のデバッグ地獄への入り口です。
横にスクロール
症状:どう気づくか
- 空の catch ブロック(
catch (e) {})や、except: passがある。 - 「たまに動かない」「原因が分からない」不具合が報告されるが、ログに何も残っていない。
- エラーをログに出しているが、出すだけで処理は続行しており、後段でおかしくなる。
try {
config = loadConfig(path);
} catch (IOException e) {
// 握りつぶし:configはnullのまま先へ進む
}
config.get("port"); // ← ここで NullPointerException(真の原因はloadConfigの失敗)
なぜ悪いのか
例外は「ここで想定外のことが起きた」という報告です。それを握りつぶすと、報告そのものが消えます。
最も厄介なのは、症状が発生源から離れた場所に、遅れて現れることです。上の例では、本当の原因は「設定ファイルの読み込み失敗」なのに、実際にプログラムが落ちるのは、はるか後段で null を触った瞬間。スタックトレースは後段を指すので、そこを何時間調べても真因にはたどり着きません。さらに悪いケースでは、落ちすらせず間違った結果を静かに出し続ける(保存したつもりのデータが消えている、など)。
直し方
捕まえたら、必ず次の3つのどれかをする。
| 打ち手 | いつ | 何をするか |
|---|---|---|
| 記録する | 自分で対処できないが記録は残したい | スタックトレースつきでログ出力し、状況を残す |
| 再送出する | ここでは対処できない/呼び出し元が判断すべき | 文脈を足して上位へ投げ直す(原因例外を保持) |
| 回復する | 想定内の失敗で、代替がある | デフォルト値・リトライ・フォールバックへ切り替える |
try {
config = loadConfig(path);
} catch (IOException e) {
// 再送出:原因を保持したまま、文脈を足して上へ
throw new ConfigException("設定の読み込みに失敗: " + path, e);
}
肝心なのは、元の例外(原因)を捨てないこと。ラップして投げ直すときも、元例外を cause として渡せば、スタックトレースが根本までつながります。
「無視して問題ない」と積極的に説明できるときだけは、意図的な無視が正当化されます。その場合でも空にせず、なぜ無視してよいのかをコメントで残すのが作法です(例:// キャッシュ削除の失敗は次回上書きされるので無視してよい)。空の catch と、意図した無視は、コメントの有無で区別できるようにします。
まとめ
- 例外の握りつぶしは、catch した後に何もしないこと。エラーが起きた事実が消える。
- 最悪なのは、症状が発生源から離れて遅れて現れること。null が後段で落ちたり、静かに誤った結果を出し続けたりして、真因にたどれない。
- 捕まえたら必ず記録・再送出・回復のどれかをする。再送出時は原因例外を保持してトレースをつなぐ。
- 意図的な無視は、なぜ無視してよいかをコメントで説明できるときだけ。空 catch とは区別する。
アンチパターン図鑑の記事ガイド
例外の握りつぶし — catchして何もしないを実務で読む
TL;DRは入口です。実際に選ぶ・使う段階では、何を解決するか、何と比較するか、導入後にどこで詰まるかまで見る必要があります。
解決すること
例外処理
比較で見る軸
難易度: intermediate / カテゴリ: アンチパターン図鑑 / タグ数: 5
導入後に効く点
最悪なのは、症状が別の場所で遅れて現れること。nullが後段で例外になったり、保存したはずのデータが消えたりし、本当の原因までたどれない。
先に潰すリスク
用語だけ覚えても、設計・実装・運用でどこに効くかを確認しないと判断を誤る。
- 難易度
- intermediate
- カテゴリ
- アンチパターン図鑑
- タグ数
- 5
判断チェックリスト
- 自社の用途が「例外処理 / エラーハンドリング」に近いか確認する。
- 強みである「例外の握りつぶしは、catchでエラーを捕まえた後に何もしない(または握りつぶして先へ進む)こと。エラーが起きた事実そのものが消える。」が本当に評価軸になるか確認する。
- 注意点の「用語だけ覚えても、設計・実装・運用でどこに効くかを確認しないと判断を誤る。」を運用で吸収できるか確認する。
- 公開値や仕様値は、対象プラン・対象機種・対象リージョンまで確認する。
- 既存システム、ID、ネットワーク、監視、バックアップとの接続方法を先に洗い出す。
- 小さく試してから、本番移行、権限設計、障害時手順、コスト監視を決める。