Go 错误处理实践指南
wxk1991 Lv5

Go 错误处理实践指南

Go 的错误处理很直接:函数返回 error,调用方检查它。虽然代码看起来比异常啰嗦,但可读性和控制力都很好。


一、基本写法

1
2
3
4
5
file, err := os.Open("config.yaml")
if err != nil {
return err
}
defer file.Close()

Go 鼓励你在错误发生的地方立即处理。


二、添加上下文

不要直接把底层错误原样丢出去。可以使用 %w 包装错误:

1
return fmt.Errorf("open config file: %w", err)

这样上层既能看到业务上下文,也能继续使用 errors.Iserrors.As 判断原始错误。


三、定义哨兵错误

1
var ErrUserNotFound = errors.New("user not found")

调用方判断:

1
2
3
if errors.Is(err, ErrUserNotFound) {
// handle not found
}

哨兵错误适合稳定的业务状态,比如不存在、重复提交、权限不足。


四、不要吞掉错误

下面这种写法很危险:

1
_, _ = file.Write(data)

除非你非常确定错误可以忽略,否则应该处理或记录。


五、日志放在边界层

底层函数通常只返回错误,不负责打日志。否则同一个错误经过多层调用时,可能被重复记录很多次。

推荐做法是:底层补充上下文,最外层统一记录日志或转换 HTTP 响应。


六、总结

Go 错误处理的核心不是少写几行,而是让失败路径清晰可见。写业务服务时,清楚的错误链路比花哨的异常机制更重要。