如何比较 Go 错误

2023-12-28

我有一个错误值,当在控制台上打印时给我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(使用前将#替换为@)

如何比较 Go 错误 的相关文章

随机推荐

  • 如何使用存储过程返回多行

    我是存储过程的新手 我编写了一个查询来获取多行 但我收到类似的错误 错误代码 1172 结果包含多行 我应该使用 CURSOR 类型吗 这是我的查询和表结构 我的表结构是 id name class section 1 abc 5 A 2
  • 如何将指针从 C# 传递到 DLL 中的本机函数?

    这是我的 DLL 函数的签名 int stdcall myFun void const context const char const pszFileName const unsigned int buffSize void const
  • xcode 8 调试器“无法解析类型”

    在 Xcode 8 中 当遇到任何断点时 我尝试在 Xcode 调试器中打印任何对象 它总是打印 无法解析类型 我在互联网上搜索得足够多了 我检查了 EditScheme gt Run gt Info gt BuildConfigurati
  • 运行计划任务的最佳方法[关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 何时使用不同的整数类型?

    编程语言 例如 c c 和 java 通常有几种整数运算类型 signed and unsigned types 不同尺寸的类型 short int long long long 保证和非保证 即依赖于实现 大小的类型 e g int32
  • CSS 网格自动适应最大内容

    我有 4 列 第 1 列和第 4 列的实际内容为 150px 第 2 列为 250px 第 3 列为 370px 我想在浏览器宽度改变时换行 当我减小浏览器的宽度时 我希望每列在换行之前缩小到最低宽度 所以我想象第四列在宽度低于 150px
  • 无效的静态方法调用语法:“[MSBuild]::IsRunningFromVisualStudio()”

    升级到 Visual Studio 2017 15 5 后 我的项目都无法正确加载 全部都标记为不可用 我在每个项目中都遇到以下错误 错误 无效的静态方法调用语法 MSBuild IsRunningFromVisualStudio 未找到方
  • Maven 从多个位置扫描警告类型

    我正在尝试使用 Maven 开发一个项目 其中还涉及 Jetty 作为 servlet 容器 但在构建时会出现 从多个位置扫描 之类的警告 其中涉及 m2 目录中的位置和创建的目标目录中的位置 我不确定它们是否是通过使用 Jetty 触发的
  • BS4:区分大小写的搜索

    是否可以只找到那些大写格式的标签 我有一个 html 页面 有标签a href gt 和标签 a href 我只想获取标签 a href format 当我尝试all index findAll A 它什么也不返回 万一我尝试all ind
  • 从另一个页面打开 Bootstrap 3 手风琴面板

    这是我的手风琴代码 div class panel group div class panel panel default div class panel heading h4 class panel title a href collap
  • 即使更新实际发生,mysql_affected_rows() 也会为 UPDATE 语句返回 0

    我正在尝试获取简单 mysql 更新查询中受影响的行数 但是 当我运行下面的代码时 PHP 的 mysql affected rows 始终等于 0 无论 foo 1 是否已经存在 在这种情况下 该函数应该正确地返回 0 因为没有行被更改
  • 使用 jQuery 动态添加行

    我正在构建一个需要多个可选输入的表单 我所拥有的基本上是这样的 每次用户按下加号按钮时 都会将新的一行表单输入添加到表单中 我该如何在 jQuery 中执行此操作 另外 当所有行都自动添加新行时 是否可以自动添加新行 或者只是最后一行 如果
  • win32 上的 python:如何获取绝对计时/CPU 周期计数

    我有一个 python 脚本 它调用基于 USB 的数据采集 C dotnet 可执行文件 主要的 python 脚本还执行许多其他操作 例如它控制步进电机 我们想要检查各种操作的相对时间 为此目的 dotnet exe 会从 C Stop
  • asp.net - 如何在 ListItem 文本属性中呈现 html 标签?

    我有一个通过服务器端填充的 DropDownList 控件 我使用 For Each datarow 循环并创建一个新的 ListItem 在 DataRow 中有一个 ID 为 Title 的列 该字段可以包含 或 标签 例如 父标题 中
  • 无法将磁盘添加到 Google VM 实例

    我无法向谷歌云虚拟机实例添加额外的磁盘 有限制吗 配额没问题 我已经添加了 6 个磁盘 第七有问题 我尝试了多个实例和多个磁盘 我收到错误 Editing VM instance X failed Error Invalid resourc
  • 如何保护使用 javax.scripting 运行的脚本?

    我在用javax scripting添加对在服务器端运行任意用户上传的 JavaScript 的支持 显然我想保护这些脚本 Rhino 本身有一个用于在运行时保护脚本的框架 的文档javax scripting但是 没有提及脚本可用的安全性
  • 解析二进制文件。什么是现代方式?

    我有一个二进制文件 其中有一些我知道的布局 例如让格式如下 2 个字节 无符号短整型 字符串的长度 5 个字节 5 个字符 字符串 一些 id 名称 4 个字节 无符号整数 一个跨步 24 字节 6 x 浮点 2 个步幅 每个步幅 3 个浮
  • 自动在后台启动应用程序?

    有没有办法让 iOS 应用程序保留在后台 以便它在设备打开时自动启动 并且在终止后会在稍后重新启动 我读过一些关于 VoIP 和 GPS 服务的帖子 我的应用程序发送带有用户位置的紧急短信 它需要保持活跃以监听遇险触发因素 是否可以通过使用
  • Mysql 从日期范围列表中生成每个日期

    我有一个查询 select from bla bla 它产生如下所示的日期范围结果 code date1 date2 a 2016 04 19 2016 04 21 b 2016 04 13 2016 04 14 我想生成 date1 和
  • 如何比较 Go 错误

    我有一个错误值 当在控制台上打印时给我Token is expired 如何将其与特定误差值进行比较 我尝试了这个但没有成功 if err errors New Token is expired log Printf Unauthorise