构建健壮错误捕获与自动恢复系统关键在于分层设计、明确责任边界及错误“可观察、可决策、可回退”,需贯穿架构、编码、测试与运维全过程,包含操作级/事务级/系统级三层拦截、类型化错误建模、匹配本质的恢复策略和可观测性闭环。

构建健壮的错误捕获与自动恢复系统,关键不在堆砌工具,而在于分层设计、明确责任边界和让错误“可观察、可决策、可回退”。它不是一次配置就能完成的事,而是贯穿架构、编码、测试和运维的持续实践。
分层拦截:从操作到系统逐级设防
单一错误处理点容易成为单点故障。应按作用域划分三层机制:
- 操作级:对单次调用做细粒度控制。比如网络请求失败时,先判断是否为可重试错误(如超时、503),再按指数退避+抖动策略重试;不可重试错误(如401、404)则直接终止并透出语义化信息。
- 事务级:保障一组关联操作的最终一致性。例如AI代理执行多步任务时,某一步失败需触发补偿逻辑(如已发消息需撤回、已写缓存需清理),而非简单抛错中断。
- 系统级:应对进程崩溃、资源耗尽等严重异常。通过进程隔离(如Lunatic的独立WASM实例)、心跳监控和自动重启策略,确保局部失败不影响整体服务可用性。
错误建模:让错误成为类型系统的一部分
避免靠字符串匹配或 instanceof 判断错误。应将错误分类前置到设计阶段:
- 定义清晰的错误类型体系,如 LangChainJS 的 AuthenticationError、RateLimitError,或 Puter 的百种 APIError 码,每类对应明确的恢复动作。
- 在语言支持时采用显式错误类型(如仓颉的 Result
或 Rust 风格枚举),强制调用方处理失败路径,而非依赖运行时 catch 捕获。 - 错误对象必须携带上下文:时间戳、操作ID、输入摘要、上游服务名——这些是定位根因和触发自动恢复的关键字段。
恢复策略:不是所有错误都该重试
盲目重试会放大问题。恢复动作需匹配错误本质:
- 对瞬时故障(网络抖动、临时限流),用带熔断的重试:设置最大尝试次数、退避间隔、失败率阈值,超限时快速失败并降级。
- 对状态不一致(如数据库写入成功但消息队列发送失败),启用 Saga 模式或本地事务表,通过异步补偿保证最终一致。
- 对不可恢复错误(权限不足、参数非法),立即返回结构化响应,并记录可审计的操作日志,供后续人工介入。
可观测性闭环:让恢复动作可验证
没有监控的恢复是盲区。必须建立反馈环:
- 所有错误捕获点统一打点:记录错误类型、发生位置、是否触发恢复、恢复是否成功。避免只记“error occurred”这种无意义日志。
- 健康探针暴露恢复能力指标:如“过去5分钟重试成功率”、“降级功能启用次数”,接入告警系统,异常波动即触发人工核查。
- 在测试环境注入典型错误(如模拟存储拒绝、模型返回空结果),验证恢复路径是否真实生效,而非仅代码存在。











