错误处理是基本功,但 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: https://github.com/affaan-m/ECC/tree/main/skills/error-handling
评论区
登录后可评论。