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
相关推荐
码士集团小青14 小时前
从对标 Java 到对标 Go:Native AOT 的“无痛化“之路,走到哪一站了?
golang
右耳朵猫AI14 小时前
Go周刊2026W36 | Go 1.27.1 发布、TinyGo 0.42、HTTP/2 原生迁入 net/http、quic-go 0.62
redis·http·golang
大树911 天前
把 Java 项目从手动 SCP 升级到 Gitee Go 自动部署:一份踩坑实录
java·golang·gitee
lmy_loveF1 天前
go 切换go version 版本
开发语言·后端·golang
智购科技自动贩卖机1 天前
自动售货机嵌入式系统安全加固实践:从Go语言国密算法到硬件防拆的工程化落地
大数据·人工智能·后端·安全·golang·系统安全
妙码生花2 天前
使用git更新ai-go-admin框架
前端·人工智能·git·golang·typescript·php
王的宝库2 天前
GO常用标准库包
开发语言·后端·golang
平头哥AI2 天前
Day 13 | 一个函数回两个值:Go 的 error 是从哪冒出来的
开发语言·后端·golang
我不会起名字3222 天前
一天一道算法题(29):单调栈
java·数据结构·python·算法·leetcode·golang·单调栈