本文只是簡單的介紹了五種錯誤處理策略,對於如何更優雅的處理錯誤,可以翻看我往期的文章。
go之父談error
go 1.13的錯誤處理
錯誤處理策略
傳播錯誤
這意味著函式中某個子程式的失敗,會變成該函式的失敗。把流程中某個子函式的錯誤「傳播」給主流程函式,並中斷。
res, err := subfunc(arg)
if err != nil
這樣的錯誤返回也可以包裝下
if err != nil
可以額外了解下 go 1.14的 unwarp error 和 %w 佔位符。這樣使用傳播錯誤可以使錯誤資訊模擬呼叫過程,呈鏈式。當錯誤最終由main函式處理時,錯誤資訊應提供清晰的從原因到後果的因果鏈。由於錯誤資訊經常是以鏈式組合在一起的,所以錯誤資訊中應避免大寫和換行符。最終的錯誤資訊可能很長,我們可以通過類似grep的工具處理錯誤資訊(譯者注:grep是一種文字搜尋工具)。
重試如果錯誤的發生時偶然性的(類似tcp的部分錯誤處理),那麼我們可以採用重試的策略,但是要注意重試的時間和次數,防止無限制的重試。在所有重試之後如果還是失敗的話,再返回錯誤。
// waitforserver 嘗試連線url引數對應的伺服器
// 它持續一分鐘的重連,並採用指數級的等待時間增加
// 如果所有重試都失敗了,將返回錯誤
func waitforserver(url string) error
log.printf("server not responding (%s);retrying…", err)
time.sleep(time.second << uint(tries)) // 指數遞增
} return fmt.errorf("server %s failed to respond after %s", url, timeout)
}
第一時間結束
這個策略一般用在 main 檔案中,當主流程遇到錯誤時,直接退出結束程式。
這個策略一般與 錯誤傳播 策略合用,將子函式傳播至主流程中,然後依照錯誤的嚴重性判斷是否結束程式。
// 在主程式中
if err := waitforserver(url); err != nil
只輸出錯誤資訊,不中斷
就是呼叫日誌系統,常見於一些小問題,如丟失等。
忽略錯誤
dir, err := ioutil.tempdir("", "scratch")
if err != nil
// ...use temp dir…
os.removeall(dir) // ignore errors; $tmpdir is cleaned periodically
儘管os.removeall會失敗,但上面的例子並沒有做錯誤處理。這是因為作業系統會定期的清理臨時目錄。正因如此,雖然程式沒有處理錯誤,但程式的邏輯不會因此受到影響。我們應該在每次函式呼叫後,都養成考慮錯誤處理的習慣,當你決定忽略某個錯誤時,你應該清晰地寫下你的意圖。 GO語言中的異常處理
go語言內建了乙個簡單的錯誤介面作為一種錯誤處理機制,介面定義如下 type error inte ce 它包含乙個 error 方法,返回值為string go的error構造有兩種方式,分別是 第一種 errors.new err errors.new this is an error if e...
GO 語言 錯誤處理
1 go錯誤處理機制,沒有try,catch 處理方式是 defer,panic,recover go丟擲乙個panic的異常,然後在defer中通過recover捕獲這個異常func test a 1 b 0 c a b c 1 0 捕獲不到 fmt.println c error main.go...
在 Go 語言中處理 Unicode
如果 go 通常是指在公園散步,用go語言處理unicode碼可以描述為不小心走進了雷區,比如,如果我們要獲取從前端頁面的一句簡單字串 hello,世界 的長度.會得到什麼結果?1fmt.println len hello,世界 2 13 等下,剛才發生了什麼?長度難道不該是9麼?其他額外的4個字元...