7.2.1. 为错误添加相关内容
发生错误的原因是作者试图在错误消息中添加 context
。 他们试图给自己留下一些线索,指出错误的根源。
让我们看看使用 fmt.Errorf
的另一种方式。
func WriteConfig(w io.Writer, conf *Config) error {
buf, err := json.Marshal(conf)
if err != nil {
return fmt.Errorf("could not marshal config: %v", err)
}
if err := WriteAll(w, buf); err != nil {
return fmt.Errorf("could not write config: %v", err)
}
return nil
}
func WriteAll(w io.Writer, buf []byte) error {
_, err := w.Write(buf)
if err != nil {
return fmt.Errorf("write failed: %v", err)
}
return nil
}
通过将注释与返回的错误组合起来,就更难以忘记错误的返回来避免意外继续。
如果写入文件时发生 I/O
错误,则 error
的 Error()
方法会报告以下类似的内容;
could not write config: write failed: input/output error