Go函数向上返回错误时,补充“正在做什么”能让日志更有用。但如果丢掉原始错误,调用方就难以继续做可靠判断。

用包装保留错误关系
fmt.Errorf中的%w可以包装一个错误,使错误链保留下来。只把错误文字拼进普通字符串,虽然看起来类似,却无法提供同样的错误关系。包装时也不要把密码或完整敏感请求写进上下文。
用errors.Is判断约定错误
示例定义一个简单的哨兵错误,经过一层包装后,errors.Is仍能判断是否包含它。不要依赖字符串包含“not found”来决定业务分支,因为文字变化或翻译都会影响判断。
先定义调用者需要知道什么
并非所有内部错误都适合成为公开接口的一部分。返回之前应考虑调用方需要重试、提示用户还是停止处理。示例展示语言机制,实际项目应有稳定的错误约定,并避免把底层细节无条件暴露出去。
可复制的练习
package main
import (
"errors"
"fmt"
)
var ErrMissing = errors.New("record missing")
func lookup() error {
return fmt.Errorf("lookup demo record: %w", ErrMissing)
}
func main() {
fmt.Println(errors.Is(lookup(), ErrMissing))
}
本例在隔离的本地环境检查过,Go 1.25.6;下面列出对应运行结果。
true
参考与延伸阅读
Go 官方文档。本文的学习步骤和练习为本站整理;涉及具体产品或工具时,请同时核对当前版本说明。
资料查阅与编辑日期:2026年9月22日。作者:玖柒。
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END







