我的项目包含一个自定义错误类型errNotFound,其中嵌入了一个错误。现在我有一个pkg/errors包,它会生成一个打印调用堆栈的错误。但是当我将此错误内联到 errNotFound 中时,不会打印调用堆栈。这是一个示例,我该如何更改它?简单的:package mainimport ( "fmt" stderrors "errors" "github.com/pkg/errors")func findSomething() error { return errors.Errorf("something not found")}func main() { err := findSomething() // can print error stack exitf("Error1: %+v", err) fmt.Println() fmt.Println() // cannot print error stack err = ErrNotFound(err) exitf("Error2: %+v", err)}func exitf(format string, args ...interface{}) { fmt.Printf(format, args...) //os.Exit(1)}type errNotFound struct{ error }func ErrNotFound(err error) error { if err == nil || IsErrNotFound(err) { return err } return errNotFound{err}}func IsErrNotFound(err error) bool { return stderrors.As(err, &errNotFound{})}输出:$ go run mainError1: something not foundmain.findSomething /home/lianxm/github.com/play_error/main.go:11main.main /home/lianxm/github.com/play_error/main.go:15runtime.main /usr/local/go/src/runtime/proc.go:255runtime.goexit /usr/local/go/src/runtime/asm_amd64.s:1581Error2: something not found我知道我可以得到原始错误err = errors.Unwrap(err)然后打印它,但这意味着我每次打印前都需要这样做,这不是很优雅的代码,我真的不想这样做......这是一个示例项目:https ://github.com/lianxmfor/play_error
3 回答
狐的传说
TA贡献1804条经验 获得超3个赞
如果您已经拥有堆栈,是否有必要将错误放入另一个错误?
如果是...您可以为 errNotFound 定义一个方法,例如:
func (e errNotFound) Error() string {
return fmt.Printf("NotFound: %+v", e.err)
}
江户川乱折腾
TA贡献1851条经验 获得超5个赞
您需要使用堆栈注释错误:
func ErrNotFound(err error) error {
if err == nil || IsErrNotFound(err) {
return err
}
return errors.WithStack(errNotFound{err})
}
- 3 回答
- 0 关注
- 208 浏览
添加回答
举报
0/150
提交
取消
