如何处理 Go 中的大量错误?我查看了我的代码,发现它充满了错误处理程序:err = result.Scan(&bot.BID, &bot.LANGUAGE, &bot.SOURCE)if err != nil { log.Fatalf("result.Scan: %v", err) return}fileName, err := copySourceToTemporaryFile(bot)if err != nil { log.Fatalf("copySourceToTemporaryFile: %v", err) return}...很多行看起来像:// do something// handle error// handle error// handle error// do something 2// handle error// handle error// handle error我可以创建一个打印错误并停止处理的默认处理程序,或者至少将这个“错误处理程序垃圾”移出我的代码逻辑吗?
2 回答
陪伴而非守候
TA贡献1757条经验 获得超8个赞
这让我想起了 Rob Pike最近的Errors are values,以及Rob Pike 先生在 GoCon 2014 上教我关于 Go 中错误处理的实践
然而,关键的教训是错误是值,Go 编程语言的全部功能可用于处理它们。
值得强调的是,无论设计如何,程序检查错误(无论它们是否暴露)都是至关重要的。这里的讨论不是关于如何避免检查错误,而是关于使用语言来优雅地处理错误。
一种技术是定义一个名为 an 的对象errWriter:
type errWriter struct {
w io.Writer
err error
}
该write方法调用底层的Write方法Writer并记录第一个错误以备后用:
func (ew *errWriter) write(buf []byte) {
if ew.err != nil {
return
}
_, ew.err = ew.w.Write(buf)
}
一旦发生错误,该write方法就会变为空操作,但error会保存该值。
给定errWriter类型及其写入方法,上面的代码可以重构:
ew := &errWriter{w: fd}
ew.write(p0[a:b])
ew.write(p1[c:d])
ew.write(p2[e:f])
// and so on
if ew.err != nil {
return ew.err
}
- 2 回答
- 0 关注
- 190 浏览
添加回答
举报
0/150
提交
取消