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
相关推荐
大侠归来20 小时前
C 与 Go 语言对比:从设计哲学到工程实践
java·c语言·golang
小小龙学IT21 小时前
Go 语言内存管理与垃圾回收(GC)深度解析:从逃逸分析到性能调优适
golang·go1.19
HEJOO91 天前
Go 语言结构体定义与实例详解
开发语言·算法·golang
墨鱼老师1 天前
Go+Gin+Vue 毕设项目:Gin 框架搭建后端基础接口实战
vue.js·golang·go·gin·前后端分离·计算机毕业设计·go 后端
JWASX2 天前
Java 转 go 学习 - 类型转换
学习·golang
小小龙学IT2 天前
Go 语言 encoding/json 标准库深度解析:从 Tag 反射到流式处理
golang·json
JWASX2 天前
Java 转 go 学习 - 函数(1)
学习·golang
看浪的路人2 天前
第7讲:实时告警与自动化响应
开发语言·后端·golang
小小龙学IT2 天前
Go 语言 database/sql 标准库深度解析:从连接池到驱动抽象
数据库·sql·golang
wdfk_prog2 天前
Wi-Fi Direct 源码分析(09):从 P2P_CONNECT 到 GO Negotiation 完成
运维·服务器·ubuntu·golang·asp.net·p2p·wifi-direct