序
本文次要钻研一下 golang 的 error 包装
error
type error interface {Error() string
}
error 接口定义了 Error 办法,返回 string
runtime.Error
package runtime
type Error interface {
error
// and perhaps other methods
}
对于 panic,产生的则是 runtime.Error,该接口内嵌了 error 接口
wrap
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 能够携带堆栈
输入
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%
小结
- error 接口定义了 Error 办法,返回 string;对于 panic,产生的则是 runtime.Error,该接口内嵌了 error 接口
- 应用内置的 errors,则没方法打印堆栈;应用 pkg/errors 能够携带堆栈
doc
- Errors
- pkg/errors
- Embedding Interfaces in Go (Golang)