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

我的项目包含一个自定义错误类型errNotFound,其中嵌入了一个错误。现在我有一个pkg/errors包,它会生成一个打印调用堆栈的错误。但是当我将此错误内联到 errNotFound 中时,不会打印调用堆栈。这是一个示例,我该如何更改它?

简单的:

package main


import (

    "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 main

Error1: something not found

main.findSomething

        /home/lianxm/github.com/play_error/main.go:11

main.main

        /home/lianxm/github.com/play_error/main.go:15

runtime.main

        /usr/local/go/src/runtime/proc.go:255

runtime.goexit

        /usr/local/go/src/runtime/asm_amd64.s:1581


Error2: something not found

我知道我可以得到原始错误err = errors.Unwrap(err)然后打印它,但这意味着我每次打印前都需要这样做,这不是很优雅的代码,我真的不想这样做......


这是一个示例项目:https ://github.com/lianxmfor/play_error


慕的地8271018
浏览 210回答 3
3回答

狐的传说

如果您已经拥有堆栈,是否有必要将错误放入另一个错误?如果是...您可以为 errNotFound 定义一个方法,例如:func (e errNotFound) Error() string {    return fmt.Printf("NotFound: %+v", e.err)}

回首忆惘然

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

江户川乱折腾

您需要使用堆栈注释错误:func ErrNotFound(err error) error {        if err == nil || IsErrNotFound(err) {                return err        }        return errors.WithStack(errNotFound{err})}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go