error
文档:https://godoc.org/github.com/pkg/errors
第三方的errors,相比官方的errors,具有错误追踪功能
func Cause(err error) error 如果可能的话,返回错误的根本原因
package mainimport ("errors""fmt"myerr "github.com/pkg/errors")func main() {err := errors.New("whoops")err = myerr.Wrap(err, "xxxxxxxxx")err = myerr.Wrap(err, "yyyyyyyyy")fmt.Println(err.Error())fmt.Println(myerr.Cause(err).Error())}yyyyyyyyy: xxxxxxxxx: whoopswhoops
func New(message string) error New使用提供的消息返回一个错误。New还记录调用时的堆栈跟踪
err := errors.New("whoops")fmt.Println(err) // whoopsfmt.Printf("%+v", err)whoopsmain.mainC:/Users/user/Desktop/GOProject/src/study/杂七杂八/demo15.go:8runtime.mainD:/Go/src/runtime/proc.go:203runtime.goexitD:/Go/src/runtime/asm_amd64.s:1357
func Errorf(format string, args …interface{}) error 创建一个错误,Errorf还记录调用时的堆栈跟踪
err := errors.Errorf("whoops: %s", "foo")fmt.Printf("%+v", err)whoops: foomain.mainC:/Users/user/Desktop/SEGI/src/test/golang/4/4.go:17runtime.mainD:/Go/src/runtime/proc.go:203runtime.goexitD:/Go/src/runtime/asm_amd64.s:1357
func WithMessage(err error, message string) error
- 如果参数中err为nil,那么返回一个nil,有无堆栈跟踪得看参数中的err
func WithMessagef(err error, format string, args …interface{}) error 如果参数中err为nil,那么返回一个nil
cause := errors.New("whoops")err := errors.WithMessage(cause, "oh noes")fmt.Println(err)oh noes: whoops
func WithStack(err error) error 返回一个堆栈跟踪的err
func Unwrap(err error) error 与Wrap对应,返回参数err装饰前的err
func Wrap(err error, message string) error
- 返回带有错误信息的堆栈跟踪的err,如果参数中err为nil,返回nil
- 如果参数中的err本身就有堆栈跟踪,那么err与错误信息的堆栈跟踪信息都返回
func Wrapf(err error, format string, args …interface{}) error 同Wrap
multierror
Go -multierror是一个用于Go的包,它提供了一种将错误值列表表示为单个错误的机制。
文档:https://pkg.go.dev/github.com/hashicorp/go-multierror
var result errorif err := step1(); err != nil {result = multierror.Append(result, err)}if err := step2(); err != nil {result = multierror.Append(result, err)}return result
