我有一个错误值,当在控制台上打印时给我Token is expired
如何将其与特定误差值进行比较?我尝试了这个但没有成功:
if err == errors.New("Token is expired") {
log.Printf("Unauthorised: %s\n", err)
}
声明错误,并将其与 ' 进行比较==
'(如err == myPkg.ErrTokenExpired
)不再是 Go 1.13 的最佳实践(2019 年第 3 季度)
The 发行说明 https://tip.golang.org/doc/go1.13#error_wrapping提到:
Go 1.13 包含支持错误包装,正如首先提出的错误值建议 https://go.googlesource.com/proposal/+/master/design/29934-error-values.md并讨论了相关问题 https://golang.org/issue/29934.
一个错误e
可以包装另一个错误w
通过提供Unwrap
返回的方法w
.
Both e
and w
可用于程序,允许e
提供额外的背景信息w
或者重新解释它,同时仍然允许程序根据w
.
为了支持包装,fmt.Errorf https://tip.golang.org/doc/go1.13#fmt现在有一个%w
用于创建包装错误的动词,以及三个新函数errors https://tip.golang.org/doc/go1.13#errors包裹 (errors.Unwrap https://tip.golang.org/pkg/errors#Unwrap, errors.Is https://tip.golang.org/pkg/errors#Is and errors.As https://tip.golang.org/pkg/errors#As)简化展开和检查包装错误。
So the 错误值常见问题解答 https://golang.org/wiki/ErrorValueFAQ解释:
您需要做好准备,您收到的错误可能会被包装。
如果您当前使用比较错误==
, use errors.Is
反而。
例子:
if err == io.ErrUnexpectedEOF
becomes
if errors.Is(err, io.ErrUnexpectedEOF)
- 检查表格是否
err != nil
不需要改变。
- 比较
io.EOF
不需要改变,因为io.EOF
永远不应该被包裹。
如果您使用类型断言 or 类型开关, use errors.As
反而。例子:
if e, ok := err.(*os.PathError); ok
becomes
var e *os.PathError
if errors.As(err, &e)
还可以使用此模式来检查错误是否实现了接口。 (这是适合使用指向接口的指针的罕见情况之一。)
将类型开关重写为以下序列if-elses
.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)