为了账号安全,请及时绑定邮箱和手机立即绑定

如何比较 Go 错误

如何比较 Go 错误

Go
MYYA 2022-03-03 15:13:55
我有一个错误值,当打印在控制台上时会给我Token is expired如何将其与特定的错误值进行比较?我试过了,但没有奏效:if err == errors.New("Token is expired") {      log.Printf("Unauthorised: %s\n", err)}
查看完整描述

3 回答

?
慕姐4208626

TA贡献1852条经验 获得超7个赞

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

发行说明提到:

Go 1.13 包含对错误包装的支持,这在错误值提案中首次提出并在相关问题上进行了讨论。

一个错误可以通过提供一个返回的方法e来包装另一个错误。 两者和都可用于程序,允许为它提供额外的上下文或重新解释它,同时仍然允许程序基于.wUnwrapw
eweww

为了支持包装,fmt.Errorf现在有一个%w用于创建包装错误的动词,并且包中的三个新函数( 和errorserrors.Unwrap简化了展开和检查包装错误。errors.Iserrors.As

所以错误值FAQ解释说:

你需要做好准备,你得到的错误可能会被包装。

如果您当前使用 比较错误==,请errors.Is改用。
例子:

if err == io.ErrUnexpectedEOF

变成

if errors.Is(err, io.ErrUnexpectedEOF)
  • err != nil如果不需要更改,请检查表格。

  • 比较io.EOF不需要改变,因为io.EOF不应该被包装。

如果您使用类型断言类型 switch检查错误类型,请errors.As改用。例子:

if e, ok := err.(*os.PathError); ok

变成

var e *os.PathError
if errors.As(err, &e)

也可以使用此模式来检查错误是否实现了接口。(当指向接口的指针合适时,这是极少数情况之一。)

将类型开关重写为if-elses.


查看完整回答
反对 回复 2022-03-03
?
阿晨1998

TA贡献2037条经验 获得超6个赞

此答案适用于 Go 1.12 及更早版本。


在库中定义错误值


package fruits


var NoMorePumpkins = errors.New("No more pumpkins")

不要errors.New在代码中的任何地方创建错误,而是在发生错误时返回预定义的值,然后您可以执行以下操作:


package shop


if err == fruits.NoMorePumpkins {

     ...

}

请参阅io包错误以供参考。


这可以通过添加方法来隐藏检查实现并使客户端代码更不受fruits包中更改的影响来改进。


package fruits


func IsNoMorePumpkins(err error) bool {

    return err == NoMorePumpkins

请参阅os包错误以供参考。


查看完整回答
反对 回复 2022-03-03
?
翻阅古今

TA贡献1780条经验 获得超5个赞

尝试

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

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


查看完整回答
反对 回复 2022-03-03
  • 3 回答
  • 0 关注
  • 192 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信