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
这两个函数都实现了接口causer
https://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
2条答案
按热度按时间piztneat1#
不同之处在于
Wrap
包含了一个调用栈,如果你点击Go文档中的一个函数名,它会带你到源代码,你可以看到这两个函数都相当简短,只有一个不同之处;当WithMessage
使用给定的消息和原因(传入的错误)创建一个新的错误时,Wrap
接受这个错误并 * 再次 * 将其 Package 如下:这里
err
是它刚刚创建的新错误(与WithMessage
中的错误完全相同),callers
填充了一个调用堆栈,这在文档中有说明(强调是我的):Wrap返回错误在调用Wrap时用堆栈跟踪注解err
这在
WithMessage
中没有提到,因为它不是由该函数完成的。3pmvbmvn2#
Wrap(err,“message”)用于用附加消息“message” Package 现有错误err。这允许您向已发生的错误添加更多上下文或信息,同时仍保留原始错误消息。
WithMessage(err,“message”)用于创建带有特定消息“message”的新错误。当您希望创建带有特定消息的新错误,而不是 Package 现有错误时,这会很有用。