Error handling 戈朗组合误差

Error handling 戈朗组合误差,error-handling,go,Error Handling,Go,假设您有一个简单的函数: 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)

假设您有一个简单的函数:

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社区中没有看到过这种错误组合,那么习惯用法是什么呢?

解决方案是将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
}