标准答案
- 添加上下文时使用 `%w` 保留原错误链,而不是只拼接字符串。
- errors.Is 适合判断哨兵错误或链上的等价原因。
- errors.As 适合提取带结构的错误类型,再根据字段决定重试、响应或告警。
- 对外返回要隐藏内部路径和 SQL,但内部日志应保留足够的 cause 和请求上下文。
题目解析
使用 %w 包装可以保留错误链,errors.Is 判断链上是否存在特定原因,errors.As 提取结构化错误。这样业务逻辑不依赖易变化的错误字符串。
错误链应在边界保留根因、操作和资源上下文,外部响应再映射为稳定错误码。对重试、降级和告警的判断应基于类型或可判断原因。
错误包装不是自动安全:日志仍要脱敏,底层 SQL、路径和凭据不能直接返回客户端。错误层次也要避免重复打印同一故障造成噪音。
常见误区
- 误区:fmt.Errorf 不使用 %w,错误链被截断。改正:需要保留根因时使用 %w,并通过 errors.Is/As 判断。
- 误区:用字符串 contains 判断错误类型。改正:使用哨兵错误、结构化类型或错误码。
- 误区:把内部错误原样返回客户端。改正:对外映射稳定、脱敏的错误,内部日志保留受控根因。