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

エラーモデリング(例外境界 / Result型 / 分類)TypeScript版:30章アウトライン📚✨

第1章:エラーは“バグ”じゃなく“仕様”でもあるよ😊📌

  • ねらい🎯:失敗を設計の対象として見る
  • 学ぶこと🧠:想定内の失敗/想定外の異常/運用で起きる失敗
  • ミニ演習📝:最近の「困った失敗」を3つ書いて分類してみる
  • AI活用🤖:失敗の言語化(原因・状況・期待結果)を整えてもらう

第2章:TS/JSのエラーが難しい3つの理由😵‍💫🧩

  • ねらい🎯:C#っぽく考えるとハマるポイントを先に知る
  • 学ぶこと🧠:throwは何でも飛ぶ🎲/Promiseで落ち方が変わる⚡/型が実行時に消える🫥
  • ミニ演習📝:throwの「怖い例」を3つ挙げる(string、objectなど)
  • AI活用🤖:「JSエラーの事故パターン」を箇条書きで出してもらう

第3章:Errorオブジェクト入門(まず読む力)📖🧯

  • ねらい🎯:message/name/stack をちゃんと使える
  • 学ぶこと🧠:stackの読み方/ログに残す粒度
  • ミニ演習📝:わざと失敗→stackから発生箇所を特定🔎
  • AI活用🤖:「このstackの意味を説明して」と解説させる

第4章:try/catchの基本と“やりがち事故”🙅‍♀️💥

  • ねらい🎯:例外の扱いで地雷を踏まない
  • 学ぶこと🧠:握りつぶし/広すぎcatch/情報欠落で再throw
  • ミニ演習📝:悪い例を“改善版”に直す✍️
  • AI活用🤖:改善案を出させて、理由を自分で説明する練習🙂

第5章:catchは基本「unknown」だと思おう🛡️😳

  • ねらい🎯:catchした値を信用しない習慣を作る
  • 学ぶこと🧠:unknown前提で安全に扱う(型ガードの考え方)
  • ミニ演習📝:unknown → Errorへ寄せる“手順”を文章化📝
  • AI活用🤖:型ガード案を複数出させて比較する⚖️

第6章:async/awaitの失敗(try/catchが効かない!?)⚡😱

  • ねらい🎯:非同期失敗の捕まえ方を体で覚える
  • 学ぶこと🧠:awaitしないと捕まらない/Unhandled Rejectionの怖さ
  • ミニ演習📝:Unhandledをわざと起こして「どこで拾うべきか」決める🚪
  • AI活用🤖:再現条件をまとめさせる(事故報告テンプレ)🧾

第7章:Promise合成の罠(Promise.all など)🧨🧵

  • ねらい🎯:複数非同期の“まとめ方”で事故らない
  • 学ぶこと🧠:1つ落ちたらどうなる?/どこで原因を失う?
  • ミニ演習📝:複数処理の失敗を「どれが失敗したか」追える形にする
  • AI活用🤖:安全な合成パターンの候補を出させる

第8章:例外境界は“層”より“入口と出口”で考える🚪🧭

  • ねらい🎯:TS向けの境界設計の感覚をつかむ
  • 学ぶこと🧠:入口(UI/API/バッチ/Queue)と出口(表示/HTTP/ログ)
  • ミニ演習📝:自分のアプリの入口と出口を列挙して境界を引く🖊️
  • AI活用🤖:境界の置き方にツッコミ役をさせる😆

第9章:分類の軸を作ろう(迷ったら戻る地図)🗺️🏷️

  • ねらい🎯:分類がないと設計が毎回ブレるのを防ぐ
  • 学ぶこと🧠:ドメイン/インフラ/バグ(不変条件)+重大度(軽/中/重)
  • ミニ演習📝:失敗を10個列挙→分類→重大度つける📋
  • AI活用🤖:分類の反例を出させて基準を固める🧠

第10章:ドメインエラー入門(ユーザーに優しい失敗)💗🙂

  • ねらい🎯:入力ミスや業務ルール違反を“例外にしない”感覚
  • 学ぶこと🧠:例)予算超え、在庫なし、期限切れ
  • ミニ演習📝:ドメインエラーを5個作って命名する🏷️
  • AI活用🤖:命名案を10個出させて“わかりやすい”を選ぶ✨

第11章:インフラエラー入門(現実は落ちる🌩️)🔌

  • ねらい🎯:外部I/Oの失敗を怖がらず扱う
  • 学ぶこと🧠:一時的(リトライ可)/恒久的(リトライ無意味)
  • ミニ演習📝:よくある外部失敗を列挙して「再試行OK/NG」表を作る🔁
  • AI活用🤖:漏れがないかチェックさせる✅

第12章:バグ(不変条件違反)を分離する⚡🧱

  • ねらい🎯:“ここに来たらおかしい”を明文化
  • 学ぶこと🧠:Fail Fast/ユーザー表示と開発者情報の分離
  • ミニ演習📝:不変条件を3つ決めて「破ったらどうする?」を書く
  • AI活用🤖:不変条件候補を洗い出してもらう🔎

第13章:カスタムErrorの作り方(JS流)🧰✨

  • ねらい🎯:エラー種類を“メッセージ解析”に頼らない
  • 学ぶこと🧠:独自Errorの命名/持つべき情報(code等)
  • ミニ演習📝:3種類のErrorクラスを作り、投げ分ける
  • AI活用🤖:命名と責務が妥当かレビューさせる👀

第14章:Errorを“包む”技術(原因を失わない)🎁🧵

  • ねらい🎯:文脈を付け足しつつ原因を保持する
  • 学ぶこと🧠:wrapの考え方/causeチェーンの発想
  • ミニ演習📝:外部失敗を「わかる言葉」で包み直す(原因は保持)
  • AI活用🤖:ユーザー向け文言の言い換えを作らせる💬

第15章:unknown → アプリ標準のErrorへ“正規化”🧼🧺

  • ねらい🎯:どんな変なthrowが来ても“同じ形”にする
  • 学ぶこと🧠:正規化関数/分類(domain/infra/bug)へ落とす
  • ミニ演習📝:変なthrow例をいくつか想定して正規化ルールを書く📋
  • AI活用🤖:想定外ケース(反例)を出させる🧠

第16章:エラーカタログ(エラー台帳)を作ろう📚🏷️

  • ねらい🎯:エラーを散らさず運用できる形にする
  • 学ぶこと🧠:code/表示メッセージ/ログ詳細/推奨アクション
  • ミニ演習📝:台帳をMarkdownで作る(10件)📋
  • AI活用🤖:抜け漏れチェック&文言整形をさせる✅✨

第17章:Result型の考え方(TSはユニオンが強い)🎁🌈

  • ねらい🎯:例外を減らして読みやすくする
  • 学ぶこと🧠:Ok/Errの判別可能ユニオンの発想
  • ミニ演習📝:Ok/Errの2分岐だけ設計して使う
  • AI活用🤖:Resultの命名やフィールド案を比較させる

第18章:Resultの使い勝手を上げる(ヘルパー)🪄🙂

  • ねらい🎯:毎回if分岐だらけにならないようにする
  • 学ぶこと🧠:map / mapErr / andThen 的な“軽い合成”の考え方
  • ミニ演習📝:3段階処理をResultでつなぐ(ネストを減らす)⛓️
  • AI活用🤖:読みやすさレビュー役にする👀

第19章:AsyncResult(Promise)の扱い方⚡🎁

  • ねらい🎯:asyncでもResult設計を崩さない
  • 学ぶこと🧠:awaitの位置/失敗の早期return/例外との住み分け
  • ミニ演習📝:asyncな3ステップを Promise で成立させる
  • AI活用🤖:落ち方のパターンを網羅させる✅

第20章:入力チェックは“実行時”だよ🧪🫥

  • ねらい🎯:型は消えるので、境界で検証できるようにする
  • 学ぶこと🧠:parse/validateの考え方(ライブラリでも自作でもOK)
  • ミニ演習📝:入力を検証して「入力エラー」として返す設計を書く
  • AI活用🤖:入力パターン(境界値)を列挙させる📋

第21章:フォームの項目別エラー設計(UX)🫶📝

  • ねらい🎯:“どこが悪いか”が一瞬で分かる形にする
  • 学ぶこと🧠:fieldErrors(項目別)/ formError(全体)/ 再入力ガイド
  • ミニ演習📝:同じ入力失敗を「項目別」と「全体」で表現し分ける
  • AI活用🤖:優しい日本語に整える💬✨

第22章:HTTP失敗を分ける(通信 vs HTTPステータス)🌐🚦

  • ねらい🎯:fetchの“罠”で混ざりがちな2種類を分離
  • 学ぶこと🧠:ネットワーク失敗/タイムアウト/HTTP 4xx/5xx
  • ミニ演習📝:HTTPクライアントの“統一結果”を設計(成功/失敗の形)
  • AI活用🤖:よくある失敗ケースを網羅させる✅

第23章:外部APIエラーの正規化(相手はバラバラ)🌩️🧼

  • ねらい🎯:ライブラリやAPIごとの違いをドメインに入れない
  • 学ぶこと🧠:InfraErrorに変換する/リトライ可否/表示文言
  • ミニ演習📝:外部APIのエラー形式を1つ想定して正規化マップを作る🗺️
  • AI活用🤖:変換ルールの抜け漏れチェック✅

第24章:サーバ側の例外境界(APIルートで受け止める)🧱🚪

  • ねらい🎯:最後のcatch地点を決めて統一する
  • 学ぶこと🧠:ルート単位のエラーハンドラ/正規化→レスポンス変換
  • ミニ演習📝:APIルートのエラー方針を1枚にまとめる📄
  • AI活用🤖:例外境界の責務が薄いかレビューさせる👀

第25章:APIレスポンス契約(Problem Detailsで返す)🧾🌐

  • ねらい🎯:クライアントが機械的に扱える失敗形式を作る
  • 学ぶこと🧠:status/type/title/detail/instance+拡張(code等)
  • ミニ演習📝:Error/Result → ProblemDetails の対応表を作る📋
  • AI活用🤖:ステータス割り当ての理由を文章化させる✍️

第26章:UI側の例外境界(見せ方を揃える)🎀🪞

  • ねらい🎯:フロントが“その場しのぎ”にならないようにする
  • 学ぶこと🧠:トースト/ダイアログ/フォーム項目エラー/再試行導線🔁
  • ミニ演習📝:同じ失敗を3種類のUI表現に変換する
  • AI活用🤖:文言のトーンを統一させる😊

第27章:ログ設計① 何を残す?(安全に)🔎🧾🔒

  • ねらい🎯:あとから原因に辿りつける
  • 学ぶこと🧠:残す項目/残しちゃダメ(個人情報・秘密)🙈
  • ミニ演習📝:ログ項目チェックリストを作成✅
  • AI活用🤖:「危ないログ例」を作らせて添削する😆

第28章:ログ設計② requestIdで一本道にする🧵🚶‍♀️

  • ねらい🎯:非同期でも“この1件”を追える
  • 学ぶこと🧠:requestId/correlationId の発想/伝播の考え方
  • ミニ演習📝:1リクエストの流れを追えるログ設計を作る🧵
  • AI活用🤖:ログから追跡できるか“監査役”をさせる👮‍♀️

第29章:レジリエンス基礎(タイムアウト/キャンセル/リトライ)⏳🛑🔁

  • ねらい🎯:現実の失敗に強い設計の入口を持つ
  • 学ぶこと🧠:待ちすぎない/キャンセルは失敗じゃないことも🙂/リトライ条件
  • ミニ演習📝:失敗種類ごとに「再試行OK/NG・ユーザー表示」を決める表を作る📋
  • AI活用🤖:反例(リトライすると地獄になるケース)を出させる😱

第30章:総合演習(AI込み)ミニプロジェクト🎓🤝🤖💖

  • ねらい🎯:設計→実装→テスト→運用観点まで一通り体験

  • 題材例🛍️:推し活グッズ管理(予算・在庫・外部支払いAPI)

  • 成果物📦:

    • 失敗の棚卸し&分類表📋
    • エラーカタログ(code/文言/対処)🏷️
    • Result型+Domain/Infraエラー型🎁
    • 例外境界(UI/API)+ProblemDetails🧾🚪
    • requestIdログ+安全ログ方針🧵🔎
    • 失敗ケース中心テスト🧪
  • AI活用テンプレ🤖:

    • 「この機能の失敗ケースを網羅して」
    • 「分類の反例を出して」
    • 「UI文言を優しく統一して」
    • 「Result→API契約の対応表を作って」
    • 「テスト観点を追加して」