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
相关推荐
运维开发笔记2 小时前
3.6 Go defer 语句学习笔记
golang
存在morning3 小时前
【Python 开发实践 一】Python vs Go vs Java 三门语言对比
java·python·golang
圣殿骑士-Khtangc15 小时前
Go字符串高效拼接性能对比与底层原理分析
服务器·前端·golang
xzlAwin20 小时前
Win10安装Go语言多版本管理器g工具
开发语言·golang
FfHUCisI1 天前
Golang RESTful API 设计原则
开发语言·golang·restful
大可-1 天前
Go Air 热重载安装配置指南
开发语言·后端·golang
Zenova EdgeOS1 天前
工业边缘 SDK 设计实战:从 API 到 Python/Go 多语言工程落地
python·golang·php
名字还没想好☜2 天前
Go 的 unsafe.Pointer 实战:零拷贝 []byte↔string 转换与三条铁律
开发语言·后端·golang·go·unsafe
xzlAwin2 天前
Go语言多版本管理器g工具命令
开发语言·golang