我有一个错误值,在控制台上打印时给我 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 包含对 错误包装 的支持,正如在 错误值提案 中首次提出并在 相关问题 上讨论的那样。
错误
Unwrap
e
可以包裹另一个错误w
w
Both
e
andw
are available to programs,e
to provide additional context tow
or to reinterpret it while still allowing programs to根据w
做出决定。To support wrapping,
fmt.Errorf
now has a%w
verb for creating wrapped errors, and three new functions in theerrors
package (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 许可协议
7 回答5.3k 阅读
6 回答6.8k 阅读✓ 已解决
4 回答2.3k 阅读
1 回答3.3k 阅读
2 回答901 阅读✓ 已解决
2 回答2.2k 阅读
1 回答2.1k 阅读
尝试
或者通过实现错误接口创建您自己的错误。