2017-03-15 62 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 
}