Go中条件错误处理通过显式检查error是否为nil,再用fmt.Errorf(推荐%w)包装或errors.New创建自定义错误,并支持errors.Is/As进行类型判断与上下文增强。
在 Go 中,条件错误处理通常通过 if 判断函数返回的错误值,并根据具体错误类型或内容决定是否返回自定义错误。这不是简单的“抛异常”,而是显式检查、封装和传递错误。
大多数 Go 标准库和第三方函数按约定返回 (result, error)。最基础的做法是先检查 error 是否为 nil,再按需构造新错误:
fmt.Errorf 包装并添加上下文errors.Is/errors.As
示例:
func readFileWithCustomErr(filename string) ([]byte, error) {Go 原生支持轻量级错误创建:
errors.New("xxx"):适合无参数的静态错误信息fmt.Errorf("xxx: %w", err):带原始错误链(推荐用于包装)fmt.Errorf("xxx: %v", err):仅记录错误字符串,丢失原始类型和堆栈
注意:%w 是错误嵌套的关键,能让 errors.Is 和 errors.Unwrap 正常工作。
除了处理外部错误,你也可以在条件不满足时主动返回自定义错误:
付却尝试再次扣款)示例:
func transfer(amount float64, from, to string) error {当需要被调用方做精细化错误处理(如重试、降级、日志分级),建议定义自己的错误类型:
error 接口 + 自定义字段(如 Code、TraceID)IsValidationError(err) 或 IsNetworkError(err)
简单自定义类型示例:
type AppError struct {