最近我开始学习Go语言并看到了很多关于如何进行错误处理的讨论。
我所看到的模式如下:
err := DoSomething()
if err != nil {
//handle
}
// continue
在管理AMQP连接时,我通常的情况是只有在错误为零时才需要继续进行操作,因为此时我需要在连接上做些事情。
c, err := Connect()
if err != nil {
return nil, err
}
s,err := c.RegisterSomethingOnConnection()
if err != nil {
return nil, err
}
val, err := s.DoSomething()
return val, err
如您所见,我只想在从Connect()
返回错误值为nil时运行c.RegisterSomethingOnConnection
这一行代码。
然而,我不喜欢上述写法,因为它使用了早期返回。早期返回会降低代码可读性,并使函数退出时间变得不清晰。目前,我的解决方案是:
var err error
var val ReturnType
c,err := Connect()
if err == nil {
s,err := c.RegisterSomethingOnConnection()
if err == nil {
val,err = s.DoSomething()
}
}
return val,err
我喜欢这样做有两个原因。首先,它可以避免返回 nil。其次,我发现这使得代码更易于维护,因为您可以在返回之前轻松添加功能(例如日志记录),并且不会因为早期返回而导致某些路径错过了添加的功能。
我的做法是否符合惯用的 Go 语言规范,或者我只是需要克服我对早期返回的厌恶,并遵循该模式?