先決定你現在是要學,還是要在專案裡做
網站負責解釋與分發工作包;真正的 Repository 掃描、缺口判斷與文件產出交給 Coding Agent。
SDLC 實作課 · 交付物練習
先理解這份文件替你消除什麼不確定
統一錯誤碼、重試與冪等策略,Dev 不用各自發明 error shape
每個 Dev 各自發明自己的 error shape:有人回 {"error": "fail"}、有人回 500 配一句中文、有人把 stack trace 直接吐給 client。
結果 4xx / 5xx 語意不一致、client 根本沒辦法統一處理失敗,retry 邏輯亂寫導致同一筆訂單扣兩次款。
Error Handling 設計強迫先把錯誤碼目錄 + 重試 / 冪等策略定下來:哪些可重試、哪些冪等、哪些要 alert、client 看得到什麼。
失敗才會變得可預測、可測試、可監控。
呼應 SD 實務洞察:「沒錯誤碼,Dev 看完還是要問三遍」——錯誤碼目錄就是那份不用問的契約。
誰負責、交給誰
主責: SD / Dev
協作: Architect(對齊 NFR / SLO 的可用性與延遲預算)、SRE(補 failure mode + alert 門檻)、QA(設計 negative tests)
下游收件: Dev 實作錯誤回應與重試、QA 寫錯誤路徑測試、SRE 設 alert
何時值得做
必要時機: 對外公開 API、跨服務 / 跨第三方呼叫、有重試或補償(saga)邏輯、有付款 / 庫存等不可重複副作用
不需要時: 純內部 script、一次性 batch、無對外契約的 PoC
常見誤用: retry 不是免費的——每條 retry 必含 backoff + jitter + max attempts + idempotency,四者缺一就是在製造 retry storm(下游剛恢復就被重試流量再次打垮)
- 01讀大綱
- 02比範本
- 03填素材
- 04貼提示詞
- 05對照驗收
Anatomy · 文件解剖
輕量版先回答 5 個核心章節
章節名稱可以因團隊調整,但每一段要求的判斷不能被省略。先讀問題,再看格式。
- 01
Executive Summary
範本必要章節
3-5 行說明本服務涵蓋哪些 endpoint、錯誤回應採 RFC 9457、主要可重試 / 不可重試錯誤、最高風險(重複扣款 / 洩漏內部錯誤)
- 02
Error Catalog(錯誤碼目錄)
範本必要章節
每個對外 endpoint 至少列其可能錯誤碼。retryable? 與 client action 兩欄不可空
- 03
Retry & Idempotency(核心)
範本必要章節
把已確認的內容、判斷依據與仍待補充的資訊清楚分開。
- 09
Risks
範本必要章節
至少 3 個(retry storm / 洩漏內部錯誤 / 吞掉例外)
- 12
Confidence & Sources & TODO
範本必要章節
把已確認的內容、判斷依據與仍待補充的資訊清楚分開。
Study · 對照學習
同一份交付物,先練核心,再看完整深度
輕量範本適合第一次練習與 MVP;完整範本保留跨職能交棒需要的細節。兩者都要求未知事項保持可見。
這張卡目前提供已審定的輕量與完整範本;不以 AI 臨時生成的內容冒充實際案例。
30 分鐘內先完成核心章節。
---
doc_type: "error-handling"
variant: "light"
status: "draft"
owner: "<your-name>"
last_updated: "YYYY-MM-DD"
upstream:
required: ["api-spec", "sequence-diagram"]
optional: ["non-functional-reqs", "threat-model"]
---
# Error Handling: <service-name>
**Status:** Draft · **Owner:** <SD/Dev> · **Last updated:** YYYY-MM-DD
> [!IMPORTANT]
> **AI 填寫規則:** 本範本 5 段(編號 1, 2, 3, 9, 12),全部必填——刻意沿用完整版的章節編號讓兩版可對照。每個錯誤碼必答四件事:**retryable 嗎?冪等嗎?要 alert 嗎?client 看得到什麼?** 每條結論行內加 `(依據:api-spec §endpoint / sequence-diagram §failure-path)`;每欄位帶 `[H]/[M]/[L]` confidence badge;缺資料寫 `_TODO: 需要 XXX_` 不編造錯誤碼。錯誤回應 body **一律用 RFC 9457(Problem Details)格式**;每條 retry 必含 backoff + jitter + max attempts + idempotency key;**不得輸出 OpenAPI / YAML schema**(那是 api-spec 卡的事)。
---
## 1. Executive Summary
<!-- ai-fill: 3-5 行說明本服務涵蓋哪些 endpoint、錯誤回應採 RFC 9457、主要可重試 / 不可重試錯誤、最高風險(重複扣款 / 洩漏內部錯誤) -->
<3-5 行說明>
> **TL;DR:** <一句話:本服務統一用 RFC 9457,X 類錯誤可重試(含冪等),Y 類不可重試直接回 client>
---
## 2. Error Catalog(錯誤碼目錄)
<!-- ai-rule: 每個對外 endpoint 至少列其可能錯誤碼。retryable? 與 client action 兩欄不可空 -->
| Code | HTTP status | Meaning | Retryable? | Client action | Confidence |
|---|---|---|---|---|---|
| `ORDER_NOT_FOUND` | 404 | 訂單不存在 | no | 顯示「找不到訂單」 | **[H]** |
| `INVENTORY_INSUFFICIENT` | 409 | 庫存不足 | no | 顯示「商品已售完」 | **[H]** |
| `PAYMENT_DECLINED` | 402 | 發卡行拒絕 | no | 提示換卡 | **[H]** |
| `PAYMENT_GATEWAY_TIMEOUT` | 504 | Stripe 逾時 | yes(同 key) | 自動重試,顯示「處理中」 | **[H]** |
| `RATE_LIMITED` | 429 | 超過配額 | yes(依 `Retry-After`) | backoff 後重試 | **[H]** |
| `INTERNAL` | 500 | 未預期錯誤 | no(client 端) | 顯示通用錯誤 + traceId | **[M]** |
---
## 3. Retry & Idempotency(核心)
| Operation | Retryable | Max attempts | Backoff | Idempotency key |
|---|---|---|---|---|
| `POST /v1/orders` | on 504/timeout | 2 | exp + jitter, base 200ms | `Idempotency-Key` header (UUID v4) |
| `Stripe charge` | on timeout/5xx | 3 | exp + jitter, base 500ms | `orderId` |
| `GET /v1/orders/{id}` | on 5xx(讀取安全) | 3 | exp + jitter | n/a(天生冪等) |
> **規則:** retryable 的前提是**冪等**。非冪等寫入沒帶 idempotency key,一律不得自動重試。
---
## 9. Risks
<!-- ai-rule: 至少 3 個(retry storm / 洩漏內部錯誤 / 吞掉例外) -->
> **R1:** <e.g. 504 自動重試但 Stripe 未帶 idempotency key → 重複扣款> — **Mitigation:** 強制以 `orderId` 為 key — **Owner:** <Dev>
>
> **R2:** <e.g. 500 把 DB 錯誤訊息直吐 client → 洩漏 schema> — **Mitigation:** 對外只回 `INTERNAL` + traceId — **Owner:** <SD>
>
> **R3:** <e.g. catch 後 swallow,client 拿到 200 但其實失敗> — **Mitigation:** 禁止空 catch,未知錯誤 map 到 `INTERNAL` — **Owner:** <Dev>
---
## 12. Confidence & Sources & TODO
- **整份文件最低 confidence 欄位:** <列出所有 [L] 與 [M]>
- **Fabricated assumptions(推測但 input 未明說):**
- <假設 1:例:假設 Stripe 逾時可安全以 orderId 重試>
- **Highest-value next input:** <下一份最該補的:實測各 endpoint 錯誤率分布 / SRE alert 門檻>
### TODO(缺資料)
- _TODO: 需要 SRE 確認哪些錯誤碼需 page、哪些只進 dashboard_
---
> [!CAUTION]
> **輸出前 AI 自檢:**
> - [ ] 5 段 H2 章節齊全(編號 1, 2, 3, 9, 12,刻意不連號)
> - [ ] 每個錯誤碼都有 retryable flag + client action
> - [ ] 每條 retry 含 backoff + jitter + max attempts + idempotency key
> - [ ] 對外不洩漏 stack trace / PII(internal 錯誤只回通用碼 + traceId)
> - [ ] 錯誤回應 body 用 RFC 9457(Problem Details)
> - [ ] 無 OpenAPI / YAML schema 輸出Practice · 換你試做
先用自己的話交代素材,不需要先學會工程術語
確定的就寫,不確定的留白。下一步要做的是請 Agent 找缺口,不是讓它替你猜一套合理答案。
可以先留白;複製提示詞後再到 Coding Agent 裡補充。
AI Practice · 手動三步
先問、再寫、最後審,不把整條流程鎖死
每一步都是獨立工作包。你可以停下補資料、修改限制或重做某一步,不需要服從固定的 Agent 接力流程。
只找阻擋文件成立的未知
先補會改變範圍、判斷或驗收結果的資訊,不急著寫文件。
我要製作「Error Handling · 錯誤處理設計」。先不要產出文件。
請根據我的素材,找出會影響這份文件正確性或可執行性的未知事項,一次最多問 5 題。
每題請包含:
1. 問題
2. 為什麼現在必須知道
3. 它會影響哪個章節或決定
已經回答的事不要重問;可以延後的事標成「待決策」;不要替我猜答案。
本文件的核心章節:Executive Summary、Error Catalog(錯誤碼目錄)、Retry & Idempotency(核心)、Risks、Confidence & Sources & TODO複製後,請在標示位置貼上自己的素材。
Review · 自己驗收
文件存在,不代表下一個角色真的能使用
逐條檢查 Agent 的輸出。人類負責需求、限制與驗收,也必須能說明重要結論從哪裡來。
帶著這份文件,繼續到「Coding Standard · 編碼規範」
下一張卡會接住新的決策問題;不用一次把整條 SDLC 全做完。
