Golang 默认不支持 wrap 多个 err, 可以手动拼接字符串:
fmt.Errorf("err1: %s, err2: %s", err1, err2)
.
但是这样会丢失原来 error 的信息, errors.Is()
与 errors.As()
也失效了.
有一些第三方库实现了这个功能:
- GitHub - uber-go/multierr: Combine one or more Go errors together
- GitHub - hashicorp/go-multierror: A Go (golang) package for representing a li…
阅读了它们的源码后, 感觉 Uber 的实现更方便点,
Hashicorp 的需要手动 Unwrap()
之后才能支持 errors.Is()
, errors.As()
,
并且, 他的这个实现也只对第一个错误进行了支持. 怪不得 otelcol 不使用 Hashicorp 的实现.
1.20 官方支持了 wrap 多个 error, 如果只是简单的 wrap errors 就可以不使用第三方包了, (第三方包里的一些工具函数还是挺方便的):
func Example() {
err1 := errors.New("error1")
err2 := errors.New("error2")
err := fmt.Errorf("err1: %w, err2: %w", err1, err2)
// Or
err = errors.Join(err1, err2)
}
参考链接: