序
本文次要钻研一下golang的error包装
error
type error interface { Error() string}
error接口定义了Error办法,返回string
runtime.Error
package runtimetype Error interface { error // and perhaps other methods}
对于panic,产生的则是runtime.Error,该接口内嵌了error接口
wrap
package mainimport ( "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能够携带堆栈
输入
test error stacktest error stackmethodB call methodC errormain.methodB /error-demo/error_wrap.go:33main.methodA /error-demo/error_wrap.go:21main.main /error-demo/error_wrap.go:15runtime.main /usr/local/go/src/runtime/proc.go:204runtime.goexit /usr/local/go/src/runtime/asm_amd64.s:1374methodA call methodB errormain.methodA /error-demo/error_wrap.go:23main.main /error-demo/error_wrap.go:15runtime.main /usr/local/go/src/runtime/proc.go:204runtime.goexit /usr/local/go/src/runtime/asm_amd64.s:1374%
小结
- error接口定义了Error办法,返回string;对于panic,产生的则是runtime.Error,该接口内嵌了error接口
- 应用内置的errors,则没方法打印堆栈;应用pkg/errors能够携带堆栈
doc
- Errors
- pkg/errors
- Embedding Interfaces in Go (Golang)