1 回答

TA贡献1816条经验 获得超4个赞
这是预期的工作,这不违反文档。多个错误可能包含在单个error值中,并且由于调用Unwrap()返回单个错误,显然没有得到您期望的内容并不意味着没有包含预期的错误。
该errors软件包来自标准库。它没有errors.Wrap()功能。您使用的是 from github.com/pkg/errors.Wrap(),它在引擎盖下进行“双重包装”。
首先它用给定的错误消息包装错误,然后再次包装以保留堆栈信息:
// Wrap returns an error annotating err with a stack trace
// at the point Wrap is called, and the supplied message.
// If err is nil, Wrap returns nil.
func Wrap(err error, message string) error {
if err == nil {
return nil
}
err = &withMessage{
cause: err,
msg: message,
}
return &withStack{
err,
callers(),
}
}
当您调用时Unwrap(),将返回来自第二次包装的错误(这不是原始错误,而是包装原始错误的包装错误),Unwrap()再次调用将返回原始错误。
fmt.Println("Double unwrap:",
errors.Unwrap(errors.Unwrap(err2wrp)) == err1)
这就是为什么你应该使用errors.Is()来避免这种“怪癖”:
fmt.Println("Proper use:", errors.Is(err2wrp, err1))
在Go Playground上试试这些。
请注意,以上报告true
是您调用github.com/pkg/errors.Is()
还是标准库的errors.Is()
.
- 1 回答
- 0 关注
- 80 浏览
添加回答
举报