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