例外の握りつぶし — catchして何もしない

空のcatchがなぜ最悪のデバッグ地獄を生むのかが分かる。原因の見えない不具合の温床を、記録・再送出・回復の3択でふさげるようになる。

中級例外処理エラーハンドリングログデバッグアンチパターン最終更新: 2026-07-28
3つの要点
TL;DR
  1. 例外の握りつぶしは、catchでエラーを捕まえた後に何もしない(または握りつぶして先へ進む)こと。エラーが起きた事実そのものが消える。
  2. 最悪なのは、症状が別の場所で遅れて現れること。nullが後段で例外になったり、保存したはずのデータが消えたりし、本当の原因までたどれない。
  3. 捕まえたら必ず何かする。記録する(ログ)・呼び出し元へ伝える(再送出)・意味のある回復をする。握りつぶしてよいのは、無視して問題ないと説明できるときだけ。

try で囲んで、catch は空。あるいはエラーを受け取って、そのまま何事もなかったように先へ進む。動いているように見えて、実は最悪のデバッグ地獄への入り口です。

横にスクロール

空のcatchで失敗を消す経路を分類・回復・観測できる経路へ改善する比較
回復できる責任層だけが例外を捕捉し、原因と相関IDを失わず処理する。

症状:どう気づくか

  • 空の 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、ネットワーク、監視、バックアップとの接続方法を先に洗い出す。
  • 小さく試してから、本番移行、権限設計、障害時手順、コスト監視を決める。

次に確認する観点

例外処理エラーハンドリングログデバッグアンチパターン