如何比较Go语言中的错误?

84

我有一个错误值,将它打印到控制台上会显示Token is expired

我该如何将其与特定的错误值进行比较?我尝试过这样,但不起作用:

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

6
我建议避免使用常规方法。请参考 Dαve Cheney 的关于错误处理的演讲 https://www.youtube.com/watch?v=lsBF58Q-DnY。我一定会回答你的问题。 - s7anley
11个回答

0
没有一个答案令人满意,所以这是我的答案:
比较常量错误
如果你的错误是一个简单的字符串,将错误从你的方法中提取出来,并使用errors.New将其保存为变量,然后使用errors.Is进行比较。例如:
import (
    "errors"
    "fmt"
)

var errSomethingWrong = errors.New("something is wrong")

func main() {
    var err error
    err = errSomethingWrong
    fmt.Println("is errSomethingWrong:", errors.Is(err, errSomethingWrong))
}

输出:

is errSomethingWrong: true

游乐场

比较包装错误

相同的函数甚至适用于包装后的错误!使用fmt.Errorf(" ... %w ... ", err)以一种可以稍后再次进行比较的方式包装错误。即使您与之进行比较的错误是以这种方式进行了包装,errors.Is也会返回true。示例:


import (
    "errors"
    "fmt"
)

var (
    myWrappedError      = errors.New("something went wrong")
    myOtherWrappedError = errors.New("this and that")
)

func main() {
    var err error
    err = fmt.Errorf("%w: %w", myWrappedError, myOtherWrappedError)

    fmt.Println("error:", err)
    fmt.Println("is myWrappedError:", errors.Is(err, myWrappedError))
    fmt.Println("is myOtherWrappedError:", errors.Is(err, myOtherWrappedError))
}

输出:

error: something went wrong: this and that
is myWrappedError: true
is myOtherWrappedError: true

游乐场


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接