让我们说你有一个简单的功能:
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社区中提到过,所以这个成语是什么?
答案 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:
...
}
}
}