为了账号安全,请及时绑定邮箱和手机立即绑定

golang pkg/errors 如何打印自定义包装的错误?

golang pkg/errors 如何打印自定义包装的错误?

Go
慕的地8271018 2022-10-31 15:44:49
我的项目包含一个自定义错误类型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)

}


查看完整回答
反对 回复 2022-10-31
?
回首忆惘然

TA贡献1847条经验 获得超11个赞

调用时exitf您可以使用errors.WithStack打印堆栈跟踪。



查看完整回答
反对 回复 2022-10-31
?
江户川乱折腾

TA贡献1851条经验 获得超5个赞

您需要使用堆栈注释错误:


func ErrNotFound(err error) error {

        if err == nil || IsErrNotFound(err) {

                return err

        }


        return errors.WithStack(errNotFound{err})

}


查看完整回答
反对 回复 2022-10-31
  • 3 回答
  • 0 关注
  • 208 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号