错误处理是基本功,但 90% 的项目都做错了——ECC 这套跨语言方案值得焊进代码库

写代码最怕什么?不是逻辑写错,是错误被吞掉了——500 报错直接甩给用户,异常悄悄静默,连日志都没留一行。

ECC 出的 error-handling 这个 Skill,就是来解决这个问题的。它不教你”怎么写 try-catch”,而是给你一套 跨语言(TypeScript / Python / Go)统一的错误处理范式,从错误类型定义、API 边界处理、重试逻辑到用户提示,全链路覆盖。

核心原则:4 条铁律

Skill 开篇先立规矩:

  • Fail fast and loudly — 错误在哪发生就在哪暴露,不要往下传
  • Typed errors over string — 错误是结构化数据,不是字符串
  • User message ≠ dev message — 用户看到友好提示,开发者看完整日志
  • Never swallow errors — 每个 catch 必须 handle / re-throw / log,三选一

这四条看着简单,但很多生产事故都倒在违反其中一条上。

TypeScript:Typed Error Class + Result Pattern

传统的 throw new Error('xxx') 没有结构,所有错误混在一起没法分类处理。Skill 给了一套分层方案:

  • 基类 AppError 包含 code、statusCode、details
  • 业务错误继承:NotFoundError、ValidationError、UnauthorizedError……
  • API 边界统一用 handleApiError() 转换成标准响应格式 { error: { code, message } }

更重要的是 Result Pattern(无异常风格):对于解析、外部调用等”失败是预期行为”的场景,返回 { ok: true, value } 或 { ok: false, error },让 TypeScript 编译器强制你处理失败路径。

Python:异常层次 + FastAPI 全局拦截

Python 侧套路类似:AppError 基类 + 子类异常体系。

亮点是 FastAPI 全局异常处理器:

  • @app.exception_handler(AppError) 拦截所有已知业务异常
  • @app.exception_handler(Exception)兜底未知错误,只记日志不泄露细节

这样 API 层的错误处理就集中在一处,不用每个 endpoint 重复 try-catch。

Go:Sentinel Errors + 错误链

Go 没有异常,错误即返回值。Skill 推荐的是 Sentinel Error(预定义错误变量) + fmt.Errorf 包装:

  • var ErrNotFound = errors.New("not found")
  • 调用链层层包装:fmt.Errorf("user %s: %w", id, ErrNotFound)
  • handler 层用 errors.Is() 解包,判断类型返回对应 HTTP 状态

这是 Go 社区公认最清晰的做法,比到处 errors.New 强太多。

重试与用户提示

Skill 还给了带指数退避的重试函数模板,以及用户错误提示的 code → message 映射表——技术人员看日志细节,普通用户看友好文案,彻底分离。

附了完整的 Checklist,code review 逐条打勾就行。

总结

这个 Skill 的价值不是教你”什么是错误”,而是给你一套可直接焊进生产代码的错误处理骨架。三语言版本对照着看,还能体会到不同语言的错误处理哲学差异。

来自 ECC(Everything Claude Code)——一个在 GitHub 斩获 140K+ Stars 的 AI Coding 增强框架,已收录 261 个专业 Skill。

GitHub 地址 →


GitHub: https://github.com/affaan-m/ECC/tree/main/skills/error-handling

评论区

0 条评论

登录后可评论。

江望 1502 阅读