エラーモデリング(例外境界 / 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契約の対応表を作って」
- 「テスト観点を追加して」