golang常用庫之pkg/errors包第三方錯誤處理包案例詳解
golang常用庫之-pkg/errors包
背景
golang自帶了錯誤信息包error
- 只提供了簡單的用法, 如errors.New(),和errors.Error()用來傳遞和獲取錯誤信息.
- 明顯官方的包已經(jīng)不能滿足了, 只能采取其他方法補(bǔ)救, 如:采用三方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.sNew方法通過傳入的text創(chuàng)建不同的errorString,這個結(jié)構(gòu)體實(shí)現(xiàn)了Error()方法,這樣便可以動態(tài)的創(chuàng)建不同的錯誤類型。
New返回了一個實(shí)現(xiàn)error接口的errorString類型的指針。 那為啥不是返回errorString的值類型??
我們在調(diào)用errors.New("")來返回一個錯誤時, **可以通過比較指針,來比較error是否相等, 實(shí)際上就是控制相同的錯誤我們只創(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才能詳細(xì)輸出
fmt.Printf("err :%+v\n", err)
}
fmt.Println("Hello world")
}
func t1() error {
return E.New("錯誤")結(jié)果:

優(yōu)秀開源項(xiàng)目使用案例
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)文章
Golang中文字符串截取函數(shù)實(shí)現(xiàn)原理
在golang中可以通過切片截取一個數(shù)組或字符串,但是當(dāng)截取的字符串是中文時,可能會出現(xiàn)問題,下面我們來自定義個函數(shù)解決Golang中文字符串截取問題2018-03-03
go語言string轉(zhuǎn)結(jié)構(gòu)體的實(shí)現(xiàn)
本文主要介紹了go語言string轉(zhuǎn)結(jié)構(gòu)體的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-03-03
B站新一代 golang規(guī)則引擎gengine基礎(chǔ)語法
這篇文章主要為大家介紹了B站新一代 golang規(guī)則引擎gengine基礎(chǔ)語法,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-12-12
Go語言中init函數(shù)與匿名函數(shù)使用淺析
這篇文章主要介紹了Go語言中init函數(shù)與匿名函數(shù)使用淺析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)吧2023-01-01

