Go: 标准库 errors
Outlinks (1)
1 · 标准库 errors#
错误是值:可以创建、传递、检验、比较判断(基于错误的控制流)
errors 包提供了一些简单的原语:创建错误、展开错误、判断错误
// 创建错误值
func New(text string) error {}
// 判断错误:控制流
func Is(err, target error) bool {}
func As(err error, target any) bool {}
func AsType[E error](err error) (E, bool) {}
// err 实现`Unwrap() error`则调用,否则返回nil
func Unwrap(err error) error {}
x/xerrors#
xerrors 是 Go 1.13 error values 提案的过渡包。
Is、As、Unwrap和fmt.Errorf的%w已合入标准库。
| 特性 | errors (std) | x/xerrors |
|---|---|---|
Is / As / Unwrap | ✅ (1.13+) | ✅ |
fmt.Errorf %w | ✅ (1.13+) | ✅ |
自动捕获调用栈 (Frame) | ❌ | ✅ |
Formatter / Printer 协议 | ❌ | ✅ |
Opaque 切断错误链 | ❌ | ✅ |
导出 Wrapper 接口 | ❌ | ✅ |
以下是未合入标准库的部分:
-
调用栈捕获(Stack Trace):标准库的
errors.New/fmt.Errorf不捕获调用栈,xerrors 会自动记录。 -
格式化协议(Formatter / Printer):标准库无此机制,xerrors 提供结构化的错误链格式化,使用
%+v打印时会输出完整错误链 + 每层的调用位置。 -
Opaque(err error) error:返回一个与err格式相同但不可 Unwrap、不可 Is/As 匹配的错误——用于切断错误链,隐藏内部实现细节。 -
Wrapper 接口:标准库在 Go 1.13 中以隐式协议(duck typing)方式使用
Unwrap(),但没有导出Wrapper接口类型。xerrors 显式导出了它。