Go错误处理:给错误加上下文,还要保留判断能力

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

相互隔离的透明开发工作盒
浅色主题概念配图,选自本站AI生成图库;非事件现场或产品实测截图。

用包装保留错误关系

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
喜欢就支持一下吧
点赞0 分享