Go语言 错误.Wrap和错误.WithMessage之间有什么区别

rm5edbpk  于 2023-01-22  发布在  Go
关注(0)|答案(2)|浏览(338)

github.com/pkg/errors
这是Wrap(err error, msg string)https://pkg.go.dev/github.com/pkg/errors#Wrap
这是WithMessage(err error, msg string)https://pkg.go.dev/github.com/pkg/errors#WithMessage
这两个函数都实现了接口causerhttps://pkg.go.dev/github.com/pkg/errors#Cause
这段代码适用于errors.WithMessage,尽管我认为应该将errors.Wrap用于errors.Cause

func main() {
    err := errors.New("first")
    err1 := errors.WithMessage(err, "tmp")
    err2 := errors.WithMessage(err1, "tmp")
    err3 := errors.WithMessage(err2, "tmp")
    fmt.Printf("%s", errors.Cause(err3))
}

Output: first

piztneat

piztneat1#

不同之处在于Wrap包含了一个调用栈,如果你点击Go文档中的一个函数名,它会带你到源代码,你可以看到这两个函数都相当简短,只有一个不同之处;当WithMessage使用给定的消息和原因(传入的错误)创建一个新的错误时,Wrap接受这个错误并 * 再次 * 将其 Package 如下:

&withStack{
    err,
    callers(),
}

这里err是它刚刚创建的新错误(与WithMessage中的错误完全相同),callers填充了一个调用堆栈,这在文档中有说明(强调是我的):
Wrap返回错误在调用Wrap时用堆栈跟踪注解err
这在WithMessage中没有提到,因为它不是由该函数完成的。

3pmvbmvn

3pmvbmvn2#

Wrap(err,“message”)用于用附加消息“message” Package 现有错误err。这允许您向已发生的错误添加更多上下文或信息,同时仍保留原始错误消息。
WithMessage(err,“message”)用于创建带有特定消息“message”的新错误。当您希望创建带有特定消息的新错误,而不是 Package 现有错误时,这会很有用。

相关问题