Golang 组合错误

10

假设你有一个简单的函数如下:

func create(path string) error {
        if err := ioutil.WriteFile(path, []byte{}, 0666); err != nil {
                return err
        }

        if err := os.Chmod(path, 0666); err != nil {
                _ = os.Remove(path)
                return err
        }

        return nil
}

我不喜欢忽略Remove()中的错误。但我也不想淹没Chmod()中的错误,也不想在我们没有成功创建()文件的情况下离开它。

这只是一个简单的例子,也许可以编写不同的函数来避免这种情况,但还有更复杂的情况会出现,而且我没有在Golang社区中看到过这种错误组合的习惯用法,所以这个惯用语是什么?

1个回答

19

解决方案是将Remove函数产生的错误存储在一个单独的变量中,并与fmt.Errorf结合使用:

if err := os.Chmod(path, 0666); err != nil {
        if e2 := os.Remove(path); e2 != nil {
            return fmt.Errorf("error changing permissions (%v); error deleting file (%v)", err, e2)
        }
        return err
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接