猿问

Go 中更简洁的错误处理

如何处理 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

我可以创建一个打印错误并停止处理的默认处理程序,或者至少将这个“错误处理程序垃圾”移出我的代码逻辑吗?


MMTTMM
浏览 191回答 2
2回答

陪伴而非守候

这让我想起了 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 onif ew.err != nil {    return ew.err}
随时随地看视频慕课网APP

相关分类

Go
我要回答