如何比较 Go 错误

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


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


if err == errors.New("Token is expired") {

      log.Printf("Unauthorised: %s\n", err)

}


MYYA
浏览 193回答 3
3回答

慕姐4208626

Go 1.13(2019 年第三季度)声明错误并将其与“ ==”(如err == myPkg.ErrTokenExpired)进行比较不再是最佳实践发行说明提到:Go 1.13 包含对错误包装的支持,这在错误值提案中首次提出并在相关问题上进行了讨论。一个错误可以通过提供一个返回的方法e来包装另一个错误。 两者和都可用于程序,允许为它提供额外的上下文或重新解释它,同时仍然允许程序基于.wUnwrapweweww为了支持包装,fmt.Errorf现在有一个%w用于创建包装错误的动词,并且包中的三个新函数( 和errors)errors.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.

阿晨1998

此答案适用于 Go 1.12 及更早版本。在库中定义错误值package fruitsvar NoMorePumpkins = errors.New("No more pumpkins")不要errors.New在代码中的任何地方创建错误,而是在发生错误时返回预定义的值,然后您可以执行以下操作:package shopif err == fruits.NoMorePumpkins {     ...}请参阅io包错误以供参考。这可以通过添加方法来隐藏检查实现并使客户端代码更不受fruits包中更改的影响来改进。package fruitsfunc IsNoMorePumpkins(err error) bool {    return err == NoMorePumpkins} 请参阅os包错误以供参考。

翻阅古今

尝试err.Error() == "Token is expired"或者通过实现错误接口来创建自己的错误。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go