error
文档:https://godoc.org/github.com/pkg/errors
第三方的errors,相比官方的errors,具有错误追踪功能
func Cause(err error) error 如果可能的话,返回错误的根本原因
package main
import (
"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: whoops
whoops
func New(message string) error New使用提供的消息返回一个错误。New还记录调用时的堆栈跟踪
err := errors.New("whoops")
fmt.Println(err) // whoops
fmt.Printf("%+v", err)
whoops
main.main
C:/Users/user/Desktop/GOProject/src/study/杂七杂八/demo15.go:8
runtime.main
D:/Go/src/runtime/proc.go:203
runtime.goexit
D:/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: foo
main.main
C:/Users/user/Desktop/SEGI/src/test/golang/4/4.go:17
runtime.main
D:/Go/src/runtime/proc.go:203
runtime.goexit
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
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 error
if err := step1(); err != nil {
result = multierror.Append(result, err)
}
if err := step2(); err != nil {
result = multierror.Append(result, err)
}
return result