我有一个错误值,在控制台上打印时给我 Token is expired
如何将它与特定的错误值进行比较?我试过了,但没有用:
if err == errors.New("Token is expired") {
log.Printf("Unauthorised: %s\n", err)
}
原文由 codec 发布,翻译遵循 CC BY-SA 4.0 许可协议
我有一个错误值,在控制台上打印时给我 Token is expired
如何将它与特定的错误值进行比较?我试过了,但没有用:
if err == errors.New("Token is expired") {
log.Printf("Unauthorised: %s\n", err)
}
原文由 codec 发布,翻译遵循 CC BY-SA 4.0 许可协议
声明错误,并将其与“ == ”进行比较(如 err == myPkg.ErrTokenExpired )不再是 Go 1.13(2019 年第三季度)的最佳实践
发行说明 提到:
Go 1.13 包含对 错误包装 的支持,正如在 错误值提案 中首次提出并在 相关问题 上讨论的那样。
错误
Unwrape可以包裹另一个错误wwBoth
eandware available to programs,eto provide additional context towor to reinterpret it while still allowing programs to根据w做出决定。To support wrapping,
fmt.Errorfnow has a%wverb for creating wrapped errors, and three new functions in theerrorspackage (errors.Unwrap,errors.Is和errors.As) 简化展开和检查包装错误。
所以 Error Value FAQ 解释道:
您需要做好准备,您得到的错误可能会被包装。
如果您当前使用
==比较错误,请改用errors.Is。例子:
if err == io.ErrUnexpectedEOF成为
if errors.Is(err, io.ErrUnexpectedEOF)
- 检查表格 if
err != nil不需要更改。- 与
io.EOF的比较不需要更改,因为io.EOF永远不应该被包装。如果您使用 类型断言 或 类型开关 检查错误类型,请改用
errors.As。例子:if e, ok := err.(*os.PathError); ok成为
var e *os.PathError if errors.As(err, &e)还可以使用此模式来检查错误是否实现了接口。 (当指向接口的指针合适时,这是少数情况之一。)
将类型开关重写为
if-elses的序列。原文由 VonC 发布,翻译遵循 CC BY-SA 4.0 许可协议
4 回答958 阅读
4 回答869 阅读✓ 已解决
2 回答612 阅读
2 回答393 阅读
尝试
或者通过实现错误接口创建您自己的错误。