7.2.1. 为错误添加相关内容

发生错误的原因是作者试图在错误消息中添加 context 。 他们试图给自己留下一些线索,指出错误的根源。

让我们看看使用 fmt.Errorf 的另一种方式。

  1. func WriteConfig(w io.Writer, conf *Config) error {
  2. buf, err := json.Marshal(conf)
  3. if err != nil {
  4. return fmt.Errorf("could not marshal config: %v", err)
  5. }
  6. if err := WriteAll(w, buf); err != nil {
  7. return fmt.Errorf("could not write config: %v", err)
  8. }
  9. return nil
  10. }
  11. func WriteAll(w io.Writer, buf []byte) error {
  12. _, err := w.Write(buf)
  13. if err != nil {
  14. return fmt.Errorf("write failed: %v", err)
  15. }
  16. return nil
  17. }

通过将注释与返回的错误组合起来,就更难以忘记错误的返回来避免意外继续。

如果写入文件时发生 I/O 错误,则 errorError() 方法会报告以下类似的内容;

  1. could not write config: write failed: input/output error