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



我正在使用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"))
^

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

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

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

我正在尝试为此获得一个惯用的例子。

按照建议声明包级变量:

var repoGaveErr = errors.New("repo gave err")
func someFunc() {
repoMock.EXPECT().Save(gomock.Eq(&foooBarBar)).Return(nil, repoGaveErr)
}

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

单个值有两个动机:

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

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

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

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

var OperationNotPermit = errors.New("operation not permitted")
func OperationNotFoundError(op string) error {
return fmt.Errorf("OperationNotPermit %w : %s", OperationNotPermit, op)
}

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

return nil, OperationNotFoundError(Op)

让我们回到问题案例:

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

var repoError = errors.New("repositoryError")
func RepositoryError(msg string) error {
return fmt.Errorf("%w: %s", repoError,msg)
}

然后在您的代码中,

repoMock.EXPECT().Save(gomock.Eq(&foooBarBar)).Return(nil, RepositoryError("YOUR CUSTOM ERROR MESSAGE"))

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

最新更新