我最近進入了Go,並且看到了很多關於如何進行錯誤處理的討論。Golang idomatic嵌套錯誤處理
我所看到的佈局模式如下:
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
,你可以看到我只想運行線c.RegisterSomethingOnConnection
如果從Connect()
返回的錯誤是零。
不過,我不喜歡上面由於前期收益。早期回報讓我感到不舒服,因爲從長遠來看,它會傷害可讀性,並在函數退出時模糊不清。到目前爲止,我的解決方案一直在執行以下操作:
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
我喜歡這樣做,原因有兩個。首先,它防止返回零。其次,我發現它使代碼更易於維護,因爲您可以在返回之前輕鬆添加功能(即記錄),並且不會由於提前返回而導致某些路徑錯過附加功能。
是我做了什麼接受習慣去還是我只需要得到超過我的早期回報的厭惡,並按照這個模式?
可能重複的[Go。最佳實踐來處理多個抽象層次的錯誤](http://stackoverflow.com/questions/37346694/go-best-practice-to-handle-error-from-multiple-abstract-level) – icza