go語言中處理錯誤的五種策略

2022-07-08 15:24:31 字數 1622 閱讀 2995

本文只是簡單的介紹了五種錯誤處理策略,對於如何更優雅的處理錯誤,可以翻看我往期的文章。

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個字元...