通常在Go中,您会找到以下约定:
res, err := thingThatCanError(arg)
if err != nil {
// handle it
}
然而,显而易见的是,对于大量这些电话来说,这非常难以接受:
res, err := thingThatCanError(arg)
if err != nil {
// handle it
}
res, err2 := thingThatCanError(arg)
if err2 != nil {
// handle it
}
res, err3 := thingThatCanError(arg)
if err3 != nil {
// handle it
}
与代码相比,样板错误处理更多! This website说避免这个,但没有举例说明如何清理这种气味。一个有用的例子来自Go blog,它向我们展示了如何使用有意义的错误处理程序清理同质HTTP应用程序。
但是想象一下这些调用中的每一个都不是同质的,就像使用相同的“中心思想”一样,所以单个“错误处理程序结构”就没有多大意义。
有没有一种方法可以清除这种类型的代码气味,而这些功能在错误方面没有“很好地融合在一起”?
答案 0 :(得分:1)
不幸的是,这些模式有时无法解决。您可以使用恐慌/延迟作为临时尝试/捕获系统,但社区会瞧不起它。
如果Go中的语句可以与赋值组合,那么
err := thing.Do()
if err != nil {
return err
}
可以成为
if err := thing.Do(); err != nil {
return err
}