Go中更简洁的错误处理

Xup*_* MV 2 error-handling exception-handling 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
}
...
Run Code Online (Sandbox Code Playgroud)

很多行看起来像:

// do something
// handle error
// handle error
// handle error

// do something 2
// handle error
// handle error
// handle error
Run Code Online (Sandbox Code Playgroud)

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

Von*_*onC 5

这让我想起最近的错误是 Rob Pike的价值观,以及Rob Pike先生教我在2014年GoCon Go中的错误处理实践

然而,关键的一课是错误是价值,并且Go编程语言的全部功能可用于处理它们.

值得强调的是,无论设计如何,程序检查错误都是至关重要的.这里的讨论不是关于如何避免检查错误,而是关于使用语言来处理错误.

一种技术是定义一个名为errWriter:

type errWriter struct {
    w   io.Writer
    err error
}
Run Code Online (Sandbox Code Playgroud)

write方法调用底层的Write方法Writer并记录第一个错误以供将来参考:

func (ew *errWriter) write(buf []byte) {
    if ew.err != nil {
        return
    }
    _, ew.err = ew.w.Write(buf)
}
Run Code Online (Sandbox Code Playgroud)

一旦发生错误,该write方法就会变为无操作,但error会保存该值.

给定errWriter类型及其write方法,可以重构上面的代码:

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
}
Run Code Online (Sandbox Code Playgroud)

  • 我之前读过.如果我调用的方法不仅返回错误而且返回不同类型的结构,该怎么办? (2认同)