go依赖包的error必须显式检查,不可忽略;应使用errors.is和errors.as判断具体错误类型;避免盲目包装错误;第三方sdk需按其文档约定处理错误。
Go 依赖包里返回的 error 值必须显式检查,不能忽略
Go 没有异常机制,所有错误都通过返回 error 类型值传递。依赖包(比如 net/http、database/sql、第三方库如 gorm 或 redis/go-redis)只要可能失败,就一定会在函数签名中暴露 error。不检查它,程序大概率会在后续 panic 或行为异常。
常见错误现象:调用 json.Unmarshal 后没看 err,结果结构体字段全是零值;或 db.QueryRow 返回 sql.ErrNoRows 却当正常数据处理,导致空指针 panic。
- 永远用
if err != nil立即判断,不要攒到函数末尾统一处理 - 不要写
_, _ = someFunc()这类丢弃 error 的代码 —— Go vet 和 staticcheck 都会报errors.Unused - 对可预期的错误(如
os.IsNotExist、sql.ErrNoRows)做类型/值判断,而非仅靠字符串匹配
用 errors.Is 和 errors.As 判断依赖包返回的具体错误类型
很多依赖包会封装底层错误(比如 io/fs 包把系统调用错误转为 fs.PathError),直接用 == 或 strings.Contains(err.Error(), "...") 不可靠,且易被包装层破坏。
正确做法是用标准库提供的错误检查工具: