Golang error使用場景介紹
前言
在Go
的編程中, error
的使用場景數(shù)不勝數(shù), 主要就是用來處理各種異常情況.
長久以來, 我的使用方式都是這樣的:
err := errors.New("fail") if err != nil{ //do somethine... }
簡單易懂.
但是, 如果我們的調(diào)用鏈是這樣的func1 -> func2 -> func3 -> func4 -> func5
, 此時func5
發(fā)生錯誤, error
逐層向上傳遞, func1
拿到錯誤后, 因為缺少堆棧信息, 很難根據(jù)error
還原出錯場景.
那么, 根據(jù)這個問題, 又該如何處理呢? 很簡單, 函數(shù)拿到error
后, 在其中添加當前上下文信息后再返回不就行了么? 類似于這樣:
func func4() error { err := func5() if err != nil { return errors.New(err.Error() + "--func4") } return nil }
這當然可以. 但是上層還可能根據(jù)不同的error
進行不同的異常處理, 這樣的話, 使用err == SameErr
的判斷條件就不好使了.
那么, 如何能夠在error
中添加信息的同時, 又不丟失原始error
的信息呢?
其實, 官方已經(jīng)做好了類似的支持.
error
在Go
的fmt
庫中有這樣一個error
:
type wrapError struct { msg string err error } func (e *wrapError) Error() string { return e.msg } func (e *wrapError) Unwrap() error { return e.err }
它提供了一個Error
方法來實現(xiàn)error
接口, 同時還會保存原始的err
信息, 可以通過Unwrap
獲得. 這不就是我們需要得么?
官方對其的使用進行了封裝, 包含了:
- 對異常進行包裝
- 判斷指定異常是否存在與包裝鏈中
- 從包裝鏈中提取指定類型的異常
// 對 err 進行包裝. // 注意, 占位符必須為 %w, 否則返回的就是一個普通 error err1 := fmt.Errorf("func4: %w", err) // 判斷 err1 中是否包含 SameErr 這個錯誤 // 相當于對所有 error 依次解包并進行 == 的比較 if errors.Is(err1, SameErr) { // 存在 SameErr } // 從 err 中獲取指定類型的錯誤 var sameErr *SameErrStruct if errors.As(err, &sameErr) { // 成功從 err 中獲取到 SameErr } // 對error 進行解包, 若失敗返回 nil retErr := errors.Unwrap(err1)
翻了翻幾個方法的源碼都比較簡單, 在這里就不細述了.
調(diào)用棧
但是, 這樣一層一層將調(diào)用信息返回去, 還是有些麻煩, 有沒有什么辦法, 能夠直接將調(diào)用棧放進去呢? 或者說, 在Go
中如何獲取調(diào)用棧呢?
func getStack() { // 獲取當前調(diào)用棧 pcs := make([]uintptr, 64) pcNum := runtime.Callers(2, pcs) // skip 2 是為了跳過 Callers 及其內(nèi)部函數(shù) // 調(diào)用棧解析 frames := runtime.CallersFrames(pcs[:pcNum]) for frame, more := frames.Next(); more; frame, more = frames.Next() { fmt.Printf("file: %s, line: %d, func: %s\n", frame.File, frame.Line, frame.Function) } }
OK, 所謂大道至簡, error
也就這么點東西, 完全能夠滿足使用了. 再見
到此這篇關(guān)于Golang error使用場景介紹的文章就介紹到這了,更多相關(guān)Go error內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Go 使用Unmarshal將json賦給struct出錯的原因及解決
這篇文章主要介紹了Go 使用Unmarshal將json賦給struct出錯的原因及解決方案,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-03-03詳解golang開發(fā)中http請求redirect的問題
這篇文章主要介紹了詳解golang開發(fā)中http請求redirect的問題,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2020-10-10