メインコンテンツまでスキップ

第6章:エラー分類の全体像(3分類)🧩

(ドメイン/インフラ/バグ)

この章は「迷ったらここに戻る地図」を作る回だよ😊✨ 以降の Result型や例外境界は、ぜんぶこの3分類が土台になるよ〜!


1) まず結論:エラーは3種類に分ける🌈

3つのエラーカテゴリ

✅ ① ドメインエラー(業務ルール違反)💗

  • 例:在庫不足、期限切れ、予算オーバー
  • 仕様として起きる(= 想定内)
  • だいたい Resultで返す(例外じゃなくて戻り値で扱う方向)✨

✅ ② インフラエラー(外部I/Oの失敗)🌩️

  • 例:DB接続できない、外部APIタイムアウト、ネット不安定
  • これも 仕様として起きる(= 想定内)
  • “一時的” なら リトライ候補になる(でも闇雲はNG)🔁 ※「一時的な障害(transient fault)」の扱いは Azure/設計ガイドでも強調されてるよ📘 (Microsoft Learn)

✅ ③ バグ(不変条件違反・想定外)💥

  • 例:絶対ありえない状態、null前提崩壊、ロジック破綻
  • “ここに来たらおかしい” なので Fail Fast(すぐ気づく)
  • 基本は 例外で止める(ログに濃い情報を残す)🧯 「例外は乱用せず、普通に起きる条件は例外にしない」系の指針は .NET の公式ドキュメントでも推されてるよ📌 (Microsoft Learn)

2) 3分類があると何が嬉しいの?😊🎁

🌟 “対応が自動で決まる”から迷いが減る

分類が決まると、次がセットで決まるよ👇

  • ユーザーに何を見せる?(優しい文言?それとも一般メッセージ?)🫶
  • ログの濃さは?(Warnで十分?スタックトレース必須?)🔎
  • リトライしていい?(するなら回数や間隔は?)🔁
  • Resultで返す?例外で落とす? 🎁🧯

3) 迷ったときの「分類フローチャート」🧭✨

分類フローチャート

次の順で質問していくと、ほぼ迷子にならないよ😊

Q1:それは “業務ルール” の話?💗

  • YES → ドメインエラー

    • 例:「在庫がない」「期限切れ」「購入上限を超えた」

Q2:外部(DB/ネット/別サービス/ファイル)に触ってる?🌩️

  • YES → インフラエラー

    • 例:「DB接続失敗」「HTTP 503」「タイムアウト」
    • 一時的失敗は retry の候補(ただし無限リトライはダメ🙅‍♀️) (Microsoft Learn)

Q3:どっちでもないのに失敗してる?💥

  • YES → バグ(不変条件違反)

    • 例:「本来ここに来ない分岐」「絶対成立するはずの条件が崩れてる」

4) 具体例で体に入れる(超大事)🧠✨

題材:推し活グッズ購入管理🛍️💖(在庫・予算・購入)

💗 ドメインエラー例(仕様で起きる)

  • 予算が足りない
  • 在庫が0
  • 同じ商品を1日3回まで、みたいなルール違反
  • 購入期限を過ぎた

👉 こういうのは「怒る」んじゃなくて「やさしく案内」する系😊 (ユーザーに説明できる=ドメイン)


🌩️ インフラエラー例(外の世界が不機嫌)

  • DB が落ちた/接続できない
  • 外部決済APIが 503(サービス停止っぽい)
  • タイムアウト(回線遅い/相手が混んでる)
  • 429(混みすぎ!後で来て!)

👉 “一時的” ならリトライ候補だけど、**回数制限・待ち時間・相手の指示(Retry-After)**とかを考える感じだよ⏳🔁 (Microsoft Learn)


💥 バグ例(設計・実装の想定が崩壊)

  • 「在庫は0以上」って決めてるのに -1 になってた
  • null にならない前提の値が null
  • switch の default に落ちた(本来ありえない)
  • ありえない状態遷移(未購入→発送済み みたいな飛び)🚀

👉 これは ユーザーのせいじゃない ので、ユーザーには一般メッセージ+ログに詳細、が基本線✨ (そして早く直す🔥)


5) 成果物:分類表の「雛形」📋✨(この章のゴール)

このフォーマットを1枚作ると、以降がめちゃ楽になるよ😊

失敗シーン(短い名前)分類(ドメイン/インフラ/バグ)例(何が起きた?)ユーザーへの見せ方開発者向けログリトライ
在庫不足ドメイン在庫=0「在庫がありません🥲」Info/Warn(状況だけ)しない
DB接続失敗インフラ接続できない「混み合ってます🙏」Error + 例外詳細場合により
在庫が-1バグ不変条件違反「エラーが発生しました🙇‍♀️」Error/Critical + 例外詳細しない

※ 例外の扱いは「よく起きる条件は例外で処理しない」方針が公式でも推されてるよ📘 (Microsoft Learn)


6) ミニ演習:あなたのアプリ想定で“分類表”を作る📋🧩

Step 1:失敗シーンを10個書く📝(まずは雑でOK)

コツ:

  • 「入力」系(ユーザーが間違える)
  • 「業務ルール」系(禁止・上限・期限)
  • 「外部I/O」系(DB/API/ファイル)
  • 「ありえない状態」系(不変条件)

Step 2:3つに振り分ける🚦

迷ったらさっきのQ1〜Q3に戻る😊

Step 3:各行に“見せ方・ログ・リトライ”を埋める🧾

  • ドメイン:やさしい文言+ログは軽め
  • インフラ:やさしい文言+ログは濃いめ(復旧に必要)+リトライ検討
  • バグ:ユーザー文言は一般的+ログは最濃(スタックトレース等)

7) AI活用:会話で分類訓練しよ🤖💬(めっちゃ効く!)

✅ 使えるプロンプト例(コピペOK)✨

  • 「次の失敗シーンを、ドメイン/インフラ/バグに分類して。理由も1行で」
  • 「迷った2つ(AとB)の違いを“判断軸”で説明して」
  • 「インフラエラーのうち“リトライしてよい可能性が高いもの”だけ抜き出して」 ※ リトライは “transient” 前提で設計ガイドがあるよ📘 (Microsoft Learn)

✅ AIに任せっぱなし防止チェック🙂

  • 「それ、ユーザーに説明できる?」→ できるならドメイン寄り💗
  • 「外部に触ってる?」→ 触ってるならインフラ寄り🌩️
  • 「本来ありえない?」→ バグ寄り💥

まとめ🎀✨

  • 迷ったら 3分類(ドメイン/インフラ/バグ) に戻る🗺️
  • 分類できると、見せ方・ログ・リトライ・例外/Result が自然に決まる🎁🧯
  • 次章(第7章)から、ドメインエラーを“型”にしていくよ〜🏷️💗

次は 第7章:ドメインエラー入門(業務ルール違反)💗 を、命名まで含めてガッツリ作るね😊✨