golang常用庫之pkg/errors包第三方錯誤處理包案例詳解
golang常用庫之-pkg/errors包
背景
golang自帶了錯誤信息包error
- 只提供了簡單的用法, 如errors.New(),和errors.Error()用來傳遞和獲取錯誤信息.
- 明顯官方的包已經(jīng)不能滿足了, 只能采取其他方法補救, 如:采用三方errors包。
關(guān)于官方errors包
Go 語言使用 error 類型來返回函數(shù)執(zhí)行過程中遇到的錯誤,如果返回的 error 值為 nil,則表示未遇到錯誤,否則 error 會返回一個字符串,用于說明遇到了什么錯誤。
查看golang的errors包你會發(fā)現(xiàn)其源碼是:
package errors // New returns an error that formats as the given text. // Each call to New returns a distinct error value even if the text is identical. func New(text string) error { return &errorString{text} } // errorString is a trivial implementation of error. type errorString struct { s string func (e *errorString) Error() string { return e.s
New方法通過傳入的text創(chuàng)建不同的errorString,這個結(jié)構(gòu)體實現(xiàn)了Error()方法,這樣便可以動態(tài)的創(chuàng)建不同的錯誤類型。
New返回了一個實現(xiàn)error
接口的errorString
類型的指針。 那為啥不是返回errorString的值類型??
我們在調(diào)用errors.New("")來返回一個錯誤時, **可以通過比較指針,來比較error是否相等, 實際上就是控制相同的錯誤我們只創(chuàng)建一個error對象。**否則對象復(fù)制一下,在比較就是false了。
而且指針才會與nil相比較, 如果是字符串"" 雖然錯誤內(nèi)容為空,但是還是有錯誤的。
看過源碼我們很清楚的知道內(nèi)置的error類型包含的信息十分有限
官方errors包使用demo
package main import ( "errors" "fmt" ) func main() { err := errors.New("errors!?。。。。。。。?!") if err != nil { fmt.Print(err) } }
什么是pkg/errors包
github.com/pkg/errors
Golang 的 error 不會像 Java 那樣打印 stackTrack 信息?;厮?err 很是不方便。
pkg/errors 是一個用的比較多,同時也比較靈活的一個golang 異常處理包,我們基于此包,可以靈活的處理軟件開發(fā)中的異常
位于github.com/pkg/errors 的errors包是Go標(biāo)準(zhǔn)庫的替代品。它提供了一些非常有用的操作用于封裝和處理錯誤。
經(jīng)過 github.com/pkg/errors 這個包來處理 err,WithStack(err) 函數(shù)能夠打印 stack
pkg/errors包使用demo
%s,%v //功能一樣,輸出錯誤信息,不包含堆棧
%q //輸出的錯誤信息帶引號,不包含堆棧
%+v //輸出錯誤信息和堆棧
如:
fmt.Println(fmt.Sprintf("%s", err))
fmt.Println(fmt.Sprintf("%q", err))
fmt.Println(fmt.Sprintf("%+v", err))
注意,使用 log.Errorf("%+v", err) 才會打印 stackTrack,使用 %v %s 不行。
package main import ( E "errors" "fmt" "github.com/pkg/errors" ) func main() { err0 := t1() err := errors.Wrap(err0, "附加信息") if err != nil { //打印錯誤需要%+v才能詳細輸出 fmt.Printf("err :%+v\n", err) } fmt.Println("Hello world") } func t1() error { return E.New("錯誤")
結(jié)果:
優(yōu)秀開源項目使用案例
https://github.com/marmotedu/errors
作者基于 github.com/pkg/errors 包,增加對 error code 的支持,完全兼容 github.com/pkg/errors。
性能跟 github.com/pkg/errors 基本持平。
該 errors 包匹配的錯誤碼設(shè)計請參考:marmotedu/sample-code
可以用于web服務(wù) code message json返回效果。
如果返回結(jié)果中存在 code 字段,則表示調(diào)用 API 接口失敗。例如:
{ "code": 100101, "message": "Database error" }
上述返回中 code 表示錯誤碼,message 表示該錯誤的具體信息。每個錯誤同時也對應(yīng)一個 HTTP 狀態(tài)碼,比如上述錯誤碼對應(yīng)了 HTTP 狀態(tài)碼 500(Internal Server Error)。
參考
Golang的錯誤處理
參考URL: https://zhuanlan.zhihu.com/p/89821850
到此這篇關(guān)于golang常用庫之-pkg/errors包 第三方錯誤處理包的文章就介紹到這了,更多相關(guān)golang pkg/errors包第三方錯誤處理包內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
關(guān)于golang利用channel和goroutine完成統(tǒng)計素數(shù)的思路
這篇文章主要介紹了golang利用channel和goroutine完成統(tǒng)計素數(shù)的思路詳解,通過思路圖分析及實例代碼相結(jié)合給大家介紹的非常詳細,需要的朋友可以參考下2021-08-08go語言開發(fā)中如何優(yōu)雅得關(guān)閉協(xié)程方法
這篇文章主要為大家介紹了go語言開發(fā)中如何優(yōu)雅得關(guān)閉協(xié)程方法詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-05-05Go語言實現(xiàn)字符串搜索算法Boyer-Moore
Boyer-Moore?算法是一種非常高效的字符串搜索算法,被廣泛的應(yīng)用于多種字符串搜索場景,下面我們就來學(xué)習(xí)一下如何利用Go語言實現(xiàn)這一字符串搜索算法吧2023-11-11Go?模塊在下游服務(wù)抖動恢復(fù)后CPU占用無法恢復(fù)原因
這篇文章主要為大家介紹了Go?模塊在下游服務(wù)抖動恢復(fù)后CPU占用無法恢復(fù)原因詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-11-11