2017-03-15 64 views
1

通常在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

我认为该网站是在保持有错误地方的号召得到。使用'err1','err2','err3',意味着你有一个理由来每次初始化一个新的错误值以便稍后进行比较,这会导致错误处理的混淆。 – JimB

+1

是的,当你在GO中编写这样的代码时,看起来很痛苦。但是,如果你想构建一个稳定的软件,而不是花费大量的时间来调试和发现错误,因为一些程序员写了大量代码而忽略了任何错误。它可能会失败,它会失败。我的建议是检查每个错误并记录下来。稍后你会说感谢你自己这样做。 –

+0

“但是,很明显这对于大量的这些调用非常快速地非常不羁地”不,不“。你有3个不同的“失败”路径,需要处理它们。这样做并不是“非常不守规矩”。 – Volker

回答

1

不幸的是,这些模式有时无法解决。你可能使用恐慌/推迟作为临时尝试/ catch系统,但社区看不起它。

如果在Go语句可以与分配相结合,从而

err := thing.Do() 
if err != nil { 
    return err 
} 

可以成为

if err := thing.Do(); err != nil { 
    return err 
}