最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

golang常用庫之pkg/errors包第三方錯誤處理包案例詳解

 更新時間:2022年03月23日 09:31:36   作者:西京刀客  
這篇文章主要介紹了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對象。**否則對象復制一下,在比較就是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標準庫的替代品。它提供了一些非常有用的操作用于封裝和處理錯誤。

經(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服務 code message json返回效果。
如果返回結(jié)果中存在 code 字段,則表示調(diào)用 API 接口失敗。例如:

{
  "code": 100101,
  "message": "Database error"
}

上述返回中 code 表示錯誤碼,message 表示該錯誤的具體信息。每個錯誤同時也對應一個 HTTP 狀態(tài)碼,比如上述錯誤碼對應了 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)文章

  • Go語言結(jié)構(gòu)化日志slog的用法解析

    Go語言結(jié)構(gòu)化日志slog的用法解析

    go?1.21.0?版本引入了一個新的包?log/slog,該包提供了結(jié)構(gòu)化日志的功能,本文小編就來和大家聊聊log/slog?包的使用,感興趣的小伙伴可以跟隨小編一起學習一下
    2023-10-10
  • Golang中文字符串截取函數(shù)實現(xiàn)原理

    Golang中文字符串截取函數(shù)實現(xiàn)原理

    在golang中可以通過切片截取一個數(shù)組或字符串,但是當截取的字符串是中文時,可能會出現(xiàn)問題,下面我們來自定義個函數(shù)解決Golang中文字符串截取問題
    2018-03-03
  • go語言string轉(zhuǎn)結(jié)構(gòu)體的實現(xiàn)

    go語言string轉(zhuǎn)結(jié)構(gòu)體的實現(xiàn)

    本文主要介紹了go語言string轉(zhuǎn)結(jié)構(gòu)體的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-03-03
  • victoriaMetrics庫布隆過濾器初始化及使用詳解

    victoriaMetrics庫布隆過濾器初始化及使用詳解

    這篇文章主要為大家介紹了victoriaMetrics庫布隆過濾器初始化及使用詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步早日升職加薪
    2022-04-04
  • Go中sync.Once源碼的深度講解

    Go中sync.Once源碼的深度講解

    sync.Once是Go語言標準庫中的一個同步原語,用于確保某個操作只執(zhí)行一次,本文將從源碼出發(fā)為大家詳細介紹一下sync.Once的具體使用,x希望對大家有所幫助
    2025-01-01
  • B站新一代 golang規(guī)則引擎gengine基礎(chǔ)語法

    B站新一代 golang規(guī)則引擎gengine基礎(chǔ)語法

    這篇文章主要為大家介紹了B站新一代 golang規(guī)則引擎gengine基礎(chǔ)語法,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-12-12
  • Go語言中init函數(shù)與匿名函數(shù)使用淺析

    Go語言中init函數(shù)與匿名函數(shù)使用淺析

    這篇文章主要介紹了Go語言中init函數(shù)與匿名函數(shù)使用淺析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習吧
    2023-01-01
  • 詳解如何在Go中使用Zap管理日志

    詳解如何在Go中使用Zap管理日志

    Zap提供了兩種類型的日志記錄器—Sugared?Logger和Logger,可以更好的管理日志,這篇文章主要為大家介紹了使用Zap管理日志的具體方法,需要的可以了解一下
    2023-07-07
  • 9個Golang中map常用示例分享

    9個Golang中map常用示例分享

    這篇文章主要和大家分享9個Golang中map可能是常用的使用案例,從1到9,越來越厲害。文中的示例代碼講解詳細,希望對大家學習Golang有一定的幫助
    2023-02-02
  • go語言方法集為類型添加方法示例解析

    go語言方法集為類型添加方法示例解析

    這篇文章主要為大家介紹了go語言方法集以及為類型添加方法示例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步早日升職加薪
    2022-04-04

最新評論

崇礼县| 青阳县| 西吉县| 佛山市| 贡嘎县| 三河市| 饶阳县| 昔阳县| 台安县| 阜平县| 临夏县| 神池县| 观塘区| 阳朔县| 鹰潭市| 唐海县| 林周县| 乐陵市| 淮南市| 昌吉市| 赤壁市| 普陀区| 班戈县| 咸丰县| 怀仁县| 平江县| 平定县| 江安县| 扎兰屯市| 府谷县| 崇仁县| 沙湾县| 响水县| 贵南县| 灵川县| 牙克石市| 湖北省| 华宁县| 平泉县| 南平市| 綦江县|