本文次要钻研一下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)