【问题标题】:How to compare errors in golang [duplicate]如何比较golang中的错误[重复]
【发布时间】:2018-05-22 14:54:00
【问题描述】:

上下文: 我正在做单元测试,并试图检查我是否得到了预期的错误。

我没有得到预期的结果,所以我尝试了一些简单的方法来比较确切的错误,我很惊讶比较返回“false”

e1 := errors.New("error")
e2 := errors.New("error")
fmt.Println(e1 == e2) // false

运行示例:https://play.golang.org/p/cvjjiJT_5T

谁能解释一下为什么返回 false 以及如何正确检查错误之间的相等性?

【问题讨论】:

  • errors.New 返回指向值的指针。 e1 / e2 是指向不同值的不同指针。等式测试必然是错误的,因为它将检查指针地址,而不是内部值。您可以使用 %#v 格式 play.golang.org/p/Vu5kaBhh6y 看到这一点。改用强类型错误和类型断言。
  • 你可以看看github.com/stretchr/testify单元测试库。它包含诸如 assert.Equal(t, err1, err2) 之类的函数,它们以适当的方式处理错误比较。

标签: unit-testing go error-handling


【解决方案1】:

您正在使用相同的错误消息创建两个不同的错误变量。当您将它们与== 进行比较时,您会得到false,因为它们不是同一个变量。

如果您想比较错误消息,请尝试e1.Error() == e2.Error()。但是,比较错误消息仍然不是一个好主意。您可能会考虑创建一些错误常量(例如 e1 == ErrContentNotFound)或在错误中添加一些 ID 并进行比较(例如 e1.ID == ContentNotFoundID)。查看https://dave.cheney.net/2016/04/07/constant-errors(以及该链接中的相关帖子)了解更多详情。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-02-24
    • 2016-03-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-24
    • 2015-06-12
    • 1970-01-01
    相关资源
    最近更新 更多