1. 程式人生 > >Go 語言如何實現error的優雅處理

Go 語言如何實現error的優雅處理

我撰寫本文,是為了迴應別處一個文章的說法。具體來說,就是錯誤處理的方式太“不優雅”。

go語言的錯誤處理方式,往往被新接觸go語言的新人所詬病。注意哦,我說的可不是“異常處理”。Go語言中是沒有異常的,儘管你會說Go語言不是使用panic和recover來處理異常的麼。但是,我必須明確指出,我是反對你這種說法的。經常使用這種說法,其實是反設計模式的。你的程式中出現某種錯誤時,Go只是使用一種類似這種處理方式去處理罷了。

Go的作者們想了很多種處理error的方案。我想他們肯定是權衡再三,從中選取了一個相對最好的解決方案,使其簡單而又優雅。

我們知道,GO是可以返回多值結果的。按照慣例,如果有錯誤發生,函式將返回一個錯誤,並且該錯誤是作為最後一個返回值返回的。

func ETPhoneHome(msg string) (string, error) {
    // implementation
}

一個error 型別如下:

type error interface {
    Error() string
}

這意味著,任何實現這個將string作為返回值的Error()方法的型別,都實現了error 介面。string返回值可以描述錯誤發生的詳情。如果覺得對此有所疑惑的話,可以回顧下Go介面的相關內容

在很多Go的程式碼中,你會見到類似如下的程式碼段:

response, err := ETPhoneHome("I can't fly this bike forever!"
) if err != nil { // handle the error, often: return err } // do something with response