首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >linter err113:不要定义动态错误,而是使用包装的静态错误

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

Stack Overflow用户
提问于 2020-06-09 20:56:51
回答 3查看 12.2K关注 0票数 20

我使用err113作为golangci-lint的一部分。

它在抱怨..。

代码语言:javascript
运行
复制
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

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

我正试着找一个习语例子来说明这一点。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2020-06-09 22:01:39

按照建议声明包级变量:

代码语言:javascript
运行
复制
 var repoGaveErr = errors.New("repo gave err")

 func someFunc() {
    repoMock.EXPECT().Save(gomock.Eq(&foooBarBar)).Return(nil, repoGaveErr)
 }

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

单一价值的动机有两种:

  • 应用程序可以比较相等的值,以检查特定的错误条件。
  • 减少内存分配(尽管在实践中可能不是什么大事)

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

票数 17
EN

Stack Overflow用户

发布于 2020-12-09 11:18:03

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

代码语言:javascript
运行
复制
var OperationNotPermit = errors.New("operation not permitted")

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

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

代码语言:javascript
运行
复制
return nil, OperationNotFoundError(Op)

让我们回到问题案例:

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

代码语言:javascript
运行
复制
var repoError = errors.New("repositoryError")

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

那么在你的代码中,

代码语言:javascript
运行
复制
repoMock.EXPECT().Save(gomock.Eq(&foooBarBar)).Return(nil, RepositoryError("YOUR CUSTOM ERROR MESSAGE"))
票数 11
EN

Stack Overflow用户

发布于 2021-01-03 21:22:05

由于以前没有说过,您的可能不需要为测试定义包级错误。如果要包装错误,以便在调用方中进行比较和展开,那么只要为测试的目的服务,在测试中返回动态错误就可以了。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62291709

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档