首页 > 解决方案 > 返回自定义错误类型与仅创建新错误

问题描述

让我们假设为了简单起见,我有一个简单的函数,它只是尝试基于作为参数传递的字符串打开文件(不要依赖文件打开过程的简单性,因为实际示例会更加复杂)

func retrieveConfig(fs billy.Filesystem, app string) (Spec, error) {
    var v Spec
    filename := "releases/" + app + ".yaml"
    file, err := fs.Open(filename)

    if err != nil {
        errOpenFile := ErrOpeningConfigFile{filename}
        return Spec{}, new errOpenFile{filename}
    }

这是我正在使用的自定义错误的定义

type ErrOpeningConfigFile struct {
    s string
}

func (errConfigFileNotFound *ErrOpeningConfigFile) Error() string {
    return fmt.Sprintf("Error opening configuration file %s")
}

我考虑采用这种方法,因为我的想法是它会提供更多的覆盖率并使核心更易于测试。

我现在可以更轻松地测试错误路径,因为我可以在单元测试中对自定义错误键入 assert。

然而,这肯定会增加代码库。

我认为相反的方法是

return nil, errors.New("Configuration file not found")

这会限制代码,但会使测试更加笨拙(或更窄的范围)。

这样做的适当(或惯用的方式)是什么?

标签: go

解决方案


推荐阅读