Golang结合错误

时间:2013-12-31 23:51:59

标签: 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)
                return err
        }

        return nil
}

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

这是一个简单的例子,也许这个函数可以用不同的方式编写以避免这种情况,但是有更复杂的情况出现,并且这种错误的组合我还没有在golang社区中提到过,所以这个成语是什么?

2 个答案:

答案 0 :(得分:16)

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

答案 1 :(得分:0)

您可以查看我的库,以简化错误处理和函数调用的管道https://github.com/go-on/queue 用法示例:

import "github.com/go-on/queue/q"

func main() {
    u := &User{}
    err := q.Q(                      
        ioutil.ReadAll, rq.Body,  // read json (returns json and error)
    )(
        // q.V pipes the json from the previous function call
        json.Unmarshal, q.V, u,   // unmarshal json from above  (returns error)
    )(
        u.Validate,               // validate the user (returns error)
    )(
        u.Save,                   // save the user (returns error)
    )(
        ok, w,                    // send the "ok" message (returns no error)
    ).Run()

    if err != nil {
       switch err {
         case *json.SyntaxError:
           ...
       }
    }
}