| name | error-handling |
| description | 錯誤處理與 Result Pattern 技能,協助開發者實作統一的錯誤處理機制,包含 Result Pattern 應用、Failure 物件建立與分層錯誤處理策略。 |
⚠️ 前置條件
本 SKILL 須搭配閱讀:開發規則
Error Handling Skill
描述
錯誤處理與 Result Pattern 技能,協助開發者實作統一的錯誤處理機制,包含 Result Pattern 應用、Failure 物件建立與分層錯誤處理。
職責
- Result Pattern 應用指導
- Failure 物件建立與封裝
- FailureCode 映射至 HTTP 狀態碼
- 分層錯誤處理策略
注意事項
Error Handling 與 API 開發流程無關
錯誤處理是跨層級的通用模式,不受「API First vs Code First」選擇影響:
- API First:Controller 實作自動產生的介面 → 使用 Result Pattern
- Code First:Controller 直接實作 → 使用 Result Pattern
- 結果:錯誤處理代碼完全相同
因此本 SKILL 未區分 API 開發流程,所有 Result Pattern 與錯誤處理指導均適用於兩種方式。
👉 API 開發流程選擇 → 參考 /api-development SKILL
核心原則
Result Pattern
使用 CSharpFunctionalExtensions 套件,統一錯誤處理:
public async Task<Result<TSuccess, Failure>> MethodAsync(...)
{
return Result.Success<TSuccess, Failure>(data);
return Result.Failure<TSuccess, Failure>(new Failure { ... });
}
Failure 物件結構
public class Failure
{
public string Code { get; set; }
public string Message { get; set; }
public string TraceId { get; set; }
public Exception? Exception { get; set; }
public Dictionary<string, object>? Data { get; set; }
}
FailureCode 列舉
public enum FailureCode
{
Unauthorized,
ValidationError,
DuplicateEmail,
NotFound,
DbError,
DbConcurrency,
InvalidOperation,
Timeout,
InternalServerError,
Unknown
}
分層錯誤處理
Repository 層
- 捕捉資料庫例外(DbUpdateException、DbUpdateConcurrencyException)
- 封裝為 Failure 物件
- 保存原始例外到 Exception 屬性
Handler 層
- 處理業務邏輯錯誤
- 轉發 Repository 的錯誤
- 不記錄日誌(由 Middleware 處理)
Controller 層
- 使用 FailureCodeMapper 映射為 HTTP 狀態碼
- 回傳適當的 HTTP 回應
Middleware 層
- ExceptionHandlingMiddleware 捕捉未處理的系統例外
- 記錄錯誤日誌
- 統一回應格式
參考文件
實作範例
開發者應參考專案內的實際實作代碼:
Failure 實作:
node .claude/skills/shared/FileResolver.js get-content \
src/JobBank1111.Infrastructure/Results/Failure.cs