error

文档:https://godoc.org/github.com/pkg/errors
第三方的errors,相比官方的errors,具有错误追踪功能

func Cause(err error) error 如果可能的话,返回错误的根本原因

  1. package main
  2. import (
  3. "errors"
  4. "fmt"
  5. myerr "github.com/pkg/errors"
  6. )
  7. func main() {
  8. err := errors.New("whoops")
  9. err = myerr.Wrap(err, "xxxxxxxxx")
  10. err = myerr.Wrap(err, "yyyyyyyyy")
  11. fmt.Println(err.Error())
  12. fmt.Println(myerr.Cause(err).Error())
  13. }
  14. yyyyyyyyy: xxxxxxxxx: whoops
  15. whoops

func New(message string) error New使用提供的消息返回一个错误。New还记录调用时的堆栈跟踪

  1. err := errors.New("whoops")
  2. fmt.Println(err) // whoops
  3. fmt.Printf("%+v", err)
  4. whoops
  5. main.main
  6. C:/Users/user/Desktop/GOProject/src/study/杂七杂八/demo15.go:8
  7. runtime.main
  8. D:/Go/src/runtime/proc.go:203
  9. runtime.goexit
  10. D:/Go/src/runtime/asm_amd64.s:1357

func Errorf(format string, args …interface{}) error 创建一个错误,Errorf还记录调用时的堆栈跟踪

  1. err := errors.Errorf("whoops: %s", "foo")
  2. fmt.Printf("%+v", err)
  3. whoops: foo
  4. main.main
  5. C:/Users/user/Desktop/SEGI/src/test/golang/4/4.go:17
  6. runtime.main
  7. D:/Go/src/runtime/proc.go:203
  8. runtime.goexit
  9. D:/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

  1. cause := errors.New("whoops")
  2. err := errors.WithMessage(cause, "oh noes")
  3. fmt.Println(err)
  4. 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

  1. var result error
  2. if err := step1(); err != nil {
  3. result = multierror.Append(result, err)
  4. }
  5. if err := step2(); err != nil {
  6. result = multierror.Append(result, err)
  7. }
  8. return result