【发布时间】:2017-01-31 01:54:18
【问题描述】:
我最近接触了 Go,看到很多关于如何进行错误处理的讨论。
我看到的布局如下:
err := DoSomething()
if err != nil {
//handle
}
// continue
经常在管理 amqp 连接时,我的条件是只有在错误为 nil 时才想继续,因为那时我需要对连接做一些事情:
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() 返回的错误为零,我只想运行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。其次,我发现它使代码更易于维护,因为您可以在返回之前轻松添加添加功能(即日志记录),并且不会让某些路径由于提前返回而错过添加的功能。
我所做的是可接受的惯用围棋,还是我只需要克服我对早期回报的厌恶并遵循该模式?
【问题讨论】: