为了账号安全,请及时绑定邮箱和手机立即绑定

Go 中更简洁的错误处理

Go 中更简洁的错误处理

Go
MMTTMM 2021-09-13 16:07:16
如何处理 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

}


查看完整回答
反对 回复 2021-09-13
  • 2 回答
  • 0 关注
  • 190 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信