我正在使用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)
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是一个典型的例子。