如何比较 Go 错误

新手上路,请多包涵

我有一个错误值,在控制台上打印时给我 Token is expired

如何将它与特定的错误值进行比较?我试过了,但没有用:

 if err == errors.New("Token is expired") {
      log.Printf("Unauthorised: %s\n", err)
}

原文由 codec 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 762
2 个回答

尝试

err.Error() == "Token is expired"

或者通过实现错误接口创建您自己的错误。

原文由 Sridhar 发布,翻译遵循 CC BY-SA 3.0 许可协议

声明错误,并将其与“ == ”进行比较(如 err == myPkg.ErrTokenExpired )不再是 Go 1.13(2019 年第三季度)的最佳实践

发行说明 提到:

Go 1.13 包含对 错误包装 的支持,正如在 错误值提案 中首次提出并在 相关问题 上讨论的那样。

错误 Unwrap e 可以包裹另一个错误 w w

Both e and w are available to programs, e to provide additional context to w 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 the errors package ( errors.Unwrap , errors.Iserrors.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 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题