Go 错误处理实践指南
Go 错误处理实践指南
Go 的错误处理很直接:函数返回 error,调用方检查它。虽然代码看起来比异常啰嗦,但可读性和控制力都很好。
一、基本写法
1 | file, err := os.Open("config.yaml") |
Go 鼓励你在错误发生的地方立即处理。
二、添加上下文
不要直接把底层错误原样丢出去。可以使用 %w 包装错误:
1 | return fmt.Errorf("open config file: %w", err) |
这样上层既能看到业务上下文,也能继续使用 errors.Is 或 errors.As 判断原始错误。
三、定义哨兵错误
1 | var ErrUserNotFound = errors.New("user not found") |
调用方判断:
1 | if errors.Is(err, ErrUserNotFound) { |
哨兵错误适合稳定的业务状态,比如不存在、重复提交、权限不足。
四、不要吞掉错误
下面这种写法很危险:
1 | _, _ = file.Write(data) |
除非你非常确定错误可以忽略,否则应该处理或记录。
五、日志放在边界层
底层函数通常只返回错误,不负责打日志。否则同一个错误经过多层调用时,可能被重复记录很多次。
推荐做法是:底层补充上下文,最外层统一记录日志或转换 HTTP 响应。
六、总结
Go 错误处理的核心不是少写几行,而是让失败路径清晰可见。写业务服务时,清楚的错误链路比花哨的异常机制更重要。