Go错误处理最佳实践进阶从error到panic的完整指南

Go错误处理最佳实践从error到panic-recover的完整指南

文章导语

错误处理是Go的"招牌特性"------没有try-catch,只有if err != nil。但很多人只会机械地返回error,不理解错误包装、错误链、哨兵错误等进阶模式。

一、错误包装(Wrapping)

go 复制代码
// Go 1.13+错误包装
func GetUser(id int) (*User, error) {
    user, err := db.FindUser(id)
    if err != nil {
        return nil, fmt.Errorf("获取用户失败 id=%d: %w", id, err)
    }
    return user, nil
}

// 错误链检查
if errors.Is(err, sql.ErrNoRows) {
    // 用户不存在
}

var targetErr *ValidationError
if errors.As(err, &targetErr) {
    // 提取具体错误类型
}

二、错误处理模式

go 复制代码
// 哨兵错误
var ErrNotFound = errors.New("not found")

// 自定义错误类型
type ValidationError struct {
    Field string
    Msg   string
}
func (e *ValidationError) Error() string {
    return fmt.Sprintf("%s: %s", e.Field, e.Msg)
}

// defer错误处理
func CopyFile(dst, src string) (err error) {
    r, err := os.Open(src)
    if err != nil { return }
    defer r.Close()
    w, err := os.Create(dst)
    if err != nil { return }
    defer func() {
        w.Close()
        if err != nil {
            os.Remove(dst)
        }
    }()
    _, err = io.Copy(w, r)
    return
}

三、全文总结

%w包装错误链,errors.Is/As检查错误链,哨兵错误定义公开错误常量,自定义错误类型携带上下文字段。

参考文献

  1. Go Blog - Working with Errors in Go 1.13
  2. Go errors包文档
  3. Dave Cheney - Don't just check errors
相关推荐
紧跟先前的步伐15 小时前
Go AI Agent 实战 28|Agent 的预算、超时与停止条件
开发语言·人工智能·后端·ai·golang
利威尔xu21 小时前
2026-11-05-Go内存管理面试
面试·golang
Zenova EdgeOS2 天前
Go 工业边缘错误处理实战:用 errors 构建可追溯错误链
开发语言·数据库·golang
JavaPub-rodert2 天前
从零搭建通用管理后台:ShiyuAdmin 的 Go、React 与 RBAC 实践
开发语言·react.js·golang
microrain3 天前
SagooIoT 的数据接入层只有四张表,却能接住三种外部数据
物联网·golang·数据建模·sagooiot
fly-iot3 天前
【FDE知识库】(4):企业知识库怎么选型,开源知识库分享几个,选择开源协议友好的版本,开发wiki-go项目
golang·开源·开源协议
福大大架构师每日一题3 天前
excelize v2.11.1发布:Go 1.26.0起步,16项安全修复与嵌入对象能力全面升级
开发语言·安全·golang
小小龙学IT3 天前
Go 语言 pprof 性能剖析与调优深度解析:把“卡在哪“变成一张可执行的数据图
开发语言·后端·golang
十二同学啊3 天前
Go 工程化详解:项目结构、代码规范、测试体系与 CI/CD 实践
ci/cd·golang·代码规范
利威尔xu3 天前
Go IM 源码实战(14):本地缓存快 3000 倍,失效却难 10 倍
后端·缓存·微服务·面试·golang