linter err113:不定义动态错误,而是使用包装的静态错误

k1e*_*ran 9 go

我正在使用err113作为golangci-lint.

它在抱怨...

foo_test.go:55:61: err113: do not define dynamic errors, use wrapped static errors instead: "errors.New(\"repo gave err\")" (goerr113)
        repoMock.EXPECT().Save(gomock.Eq(&foooBarBar)).Return(nil, errors.New("repo gave err")),
                                                                  ^

foo_test.go:22:42: err113: do not define dynamic errors, use wrapped static errors instead: "errors.New(\"oops\")" (goerr113)
    repoMock.EXPECT().FindAll().Return(nil, errors.New("oops"))
                                            ^
Run Code Online (Sandbox Code Playgroud)

解决这个问题的最佳方法是什么?

引用https://github.com/Djarvur/go-err113

此外,除了用于初始化包级变量的调用和包装其他错误的 fmt.Errorf() 调用之外,还会报告任何对 errors.New() 和 fmt.Errorf() 方法的调用。

我正在尝试为此找到一个惯用的例子。

Yus*_*sef 15

GO 1.13开始,您可以定义一个新的错误类型,包装它并使用它。例如,如果您想返回“不允许的操作”+操作。你需要实施类似的东西

var OperationNotPermit = errors.New("operation not permitted")

func OperationNotFoundError(op string) error {
    return fmt.Errorf("OperationNotPermit %w : %s", OperationNotPermit, op)
}
Run Code Online (Sandbox Code Playgroud)

然后在你的代码中,当你想返回错误时,

return nil, OperationNotFoundError(Op)
Run Code Online (Sandbox Code Playgroud)

让我们回到问题案例:

首先,定义自定义错误和 wapper

var repoError = errors.New("repositoryError")

func RepositoryError(msg string) error {
    return fmt.Errorf("%w: %s", repoError,msg)
}
Run Code Online (Sandbox Code Playgroud)

然后在你的代码中,

repoMock.EXPECT().Save(gomock.Eq(&foooBarBar)).Return(nil, RepositoryError("YOUR CUSTOM ERROR MESSAGE"))
Run Code Online (Sandbox Code Playgroud)

  • 只是想知道用这样的函数包装错误的优点...有人可以向我解释一下吗? (2认同)

thw*_*hwd 11

按照建议声明包级变量:

 var repoGaveErr = errors.New("repo gave err")

 func someFunc() {
    repoMock.EXPECT().Save(gomock.Eq(&foooBarBar)).Return(nil, repoGaveErr)
 }
Run Code Online (Sandbox Code Playgroud)

每次调用 errors.New 都会分配一个新的唯一错误值。应用程序通过声明包级变量来创建一个表示错误的值。

单一值有两个动机:

  • 应用程序可以比较相等的值以检查特定的错误条件。

  • 减少内存分配(虽然在实践中可能不是什么大问题)

io.EOF是一个典型的例子。


Kyl*_*dha 5

由于之前没有说过,您可能不需要为测试定义包级别错误。鉴于这个想法是包装错误,以便可以在调用者中比较和解开它们,只要满足测试的目的,在测试中返回动态错误就可以了。