本文主要研究一下golang的error包裝git
type error interface { Error() string }
error接口定義了Error方法,返回string
package runtime type Error interface { error // and perhaps other methods }
對於panic,產生的則是runtime.Error,該接口內嵌了error接口
package main import ( "errors" "fmt" pkgerr "github.com/pkg/errors" ) func main() { if err := methodA(false); err != nil { fmt.Printf("%+v", err) } if err := methodA(true); err != nil { fmt.Printf("%+v", err) } } func methodA(wrap bool) error { if err := methodB(wrap); err != nil { if wrap { return pkgerr.Wrap(err, "methodA call methodB error") } return err } return nil } func methodB(wrap bool) error { if err := methodC(); err != nil { if wrap { return pkgerr.Wrap(err, "methodB call methodC error") } return err } return nil } func methodC() error { return errors.New("test error stack") }
使用內置的errors,則沒辦法打印堆棧;使用pkg/errors能夠攜帶堆棧
輸出github
test error stack test error stack methodB call methodC error main.methodB /error-demo/error_wrap.go:33 main.methodA /error-demo/error_wrap.go:21 main.main /error-demo/error_wrap.go:15 runtime.main /usr/local/go/src/runtime/proc.go:204 runtime.goexit /usr/local/go/src/runtime/asm_amd64.s:1374 methodA call methodB error main.methodA /error-demo/error_wrap.go:23 main.main /error-demo/error_wrap.go:15 runtime.main /usr/local/go/src/runtime/proc.go:204 runtime.goexit /usr/local/go/src/runtime/asm_amd64.s:1374%