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

Golang error使用場(chǎng)景介紹

 更新時(shí)間:2023年03月15日 10:57:13   作者:煙草的香味.  
我們?cè)谑褂肎olang時(shí),不可避免會(huì)遇到異常情況的處理,與Java、Python等語(yǔ)言不同的是,Go中并沒(méi)有try...catch...這樣的語(yǔ)句塊,這個(gè)時(shí)候我們?nèi)绾尾拍芨玫奶幚懋惓D??本文?lái)教你正確方法

前言

Go的編程中, error的使用場(chǎng)景數(shù)不勝數(shù), 主要就是用來(lái)處理各種異常情況.

長(zhǎng)久以來(lái), 我的使用方式都是這樣的:

err := errors.New("fail")
if err != nil{
  //do somethine...
}

簡(jiǎn)單易懂.

但是, 如果我們的調(diào)用鏈?zhǔn)沁@樣的func1 -> func2 -> func3 -> func4 -> func5, 此時(shí)func5發(fā)生錯(cuò)誤, error逐層向上傳遞, func1拿到錯(cuò)誤后, 因?yàn)槿鄙俣褩P畔? 很難根據(jù)error還原出錯(cuò)場(chǎng)景.

那么, 根據(jù)這個(gè)問(wèn)題, 又該如何處理呢? 很簡(jiǎn)單, 函數(shù)拿到error后, 在其中添加當(dāng)前上下文信息后再返回不就行了么? 類似于這樣:

func func4() error {
	err := func5()
	if err != nil {
		return errors.New(err.Error() + "--func4")
	}
	return nil
}

這當(dāng)然可以. 但是上層還可能根據(jù)不同的error進(jìn)行不同的異常處理, 這樣的話, 使用err == SameErr的判斷條件就不好使了.

那么, 如何能夠在error中添加信息的同時(shí), 又不丟失原始error的信息呢?

其實(shí), 官方已經(jīng)做好了類似的支持.

error

Gofmt庫(kù)中有這樣一個(gè)error:

type wrapError struct {
	msg string
	err error
}
func (e *wrapError) Error() string {
	return e.msg
}
func (e *wrapError) Unwrap() error {
	return e.err
}

它提供了一個(gè)Error方法來(lái)實(shí)現(xiàn)error接口, 同時(shí)還會(huì)保存原始的err信息, 可以通過(guò)Unwrap獲得. 這不就是我們需要得么?

官方對(duì)其的使用進(jìn)行了封裝, 包含了:

  • 對(duì)異常進(jìn)行包裝
  • 判斷指定異常是否存在與包裝鏈中
  • 從包裝鏈中提取指定類型的異常
// 對(duì) err 進(jìn)行包裝.
// 注意, 占位符必須為 %w, 否則返回的就是一個(gè)普通 error
err1 := fmt.Errorf("func4: %w", err)
// 判斷 err1 中是否包含 SameErr 這個(gè)錯(cuò)誤
// 相當(dāng)于對(duì)所有 error 依次解包并進(jìn)行 == 的比較
if errors.Is(err1, SameErr) {
  // 存在 SameErr
}
// 從 err 中獲取指定類型的錯(cuò)誤
var sameErr *SameErrStruct
if errors.As(err, &sameErr) {
  // 成功從 err 中獲取到 SameErr
}
// 對(duì)error 進(jìn)行解包, 若失敗返回 nil
retErr := errors.Unwrap(err1)

翻了翻幾個(gè)方法的源碼都比較簡(jiǎn)單, 在這里就不細(xì)述了.

調(diào)用棧

但是, 這樣一層一層將調(diào)用信息返回去, 還是有些麻煩, 有沒(méi)有什么辦法, 能夠直接將調(diào)用棧放進(jìn)去呢? 或者說(shuō), 在Go中如何獲取調(diào)用棧呢?

func getStack() {
	// 獲取當(dāng)前調(diào)用棧
	pcs := make([]uintptr, 64)
	pcNum := runtime.Callers(2, pcs) // skip 2 是為了跳過(guò) 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, 所謂大道至簡(jiǎn), error也就這么點(diǎn)東西, 完全能夠滿足使用了. 再見(jiàn)

到此這篇關(guān)于Golang error使用場(chǎng)景介紹的文章就介紹到這了,更多相關(guān)Go error內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • go與go mod命令使用方式以及遇到的問(wèn)題

    go與go mod命令使用方式以及遇到的問(wèn)題

    這篇文章主要介紹了go與go mod命令使用方式以及遇到的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-09-09
  • Golang中深拷貝與淺拷貝詳解

    Golang中深拷貝與淺拷貝詳解

    這篇文章主要為大家詳細(xì)介紹一下Golang深拷貝和淺拷貝,文中有詳細(xì)的代碼示例供大家參考,需要的可以參考一下
    2023-05-05
  • 從零封裝Gin框架配置初始化全局變量

    從零封裝Gin框架配置初始化全局變量

    這篇文章主要為大家介紹了從零封裝Gin框架配置初始化全局變量,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2024-01-01
  • Go爬蟲(chóng)(http、goquery和colly)詳解

    Go爬蟲(chóng)(http、goquery和colly)詳解

    goquery可以避免操作復(fù)雜的正則表達(dá)式,它可以直接根據(jù)url獲取一個(gè)Document對(duì)象,然后根據(jù)標(biāo)簽選擇器、類選擇器和id選擇器獲取相應(yīng)的選擇對(duì)象,進(jìn)行自定義的操作,這篇文章主要介紹了Go爬蟲(chóng)(http、goquery和colly),需要的朋友可以參考下
    2022-09-09
  • golang端口占用檢測(cè)的使用

    golang端口占用檢測(cè)的使用

    這篇文章主要介紹了golang端口占用檢測(cè)的使用,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-03-03
  • Go語(yǔ)言帶緩沖的通道的使用

    Go語(yǔ)言帶緩沖的通道的使用

    Go語(yǔ)言中有緩沖的通道是一種在被接收前能存儲(chǔ)一個(gè)或者多個(gè)值的通道,本文就來(lái)介紹一下Go語(yǔ)言帶緩沖的通道的使用,具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-01-01
  • Go語(yǔ)言模擬while語(yǔ)句實(shí)現(xiàn)無(wú)限循環(huán)的方法

    Go語(yǔ)言模擬while語(yǔ)句實(shí)現(xiàn)無(wú)限循環(huán)的方法

    這篇文章主要介紹了Go語(yǔ)言模擬while語(yǔ)句實(shí)現(xiàn)無(wú)限循環(huán)的方法,實(shí)例分析了for語(yǔ)句模擬while語(yǔ)句的技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-02-02
  • 解決Golang time.Parse和time.Format的時(shí)區(qū)問(wèn)題

    解決Golang time.Parse和time.Format的時(shí)區(qū)問(wèn)題

    這篇文章主要介紹了解決Golang time.Parse和time.Format的時(shí)區(qū)問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2021-04-04
  • Go 語(yǔ)言單例模式示例詳解

    Go 語(yǔ)言單例模式示例詳解

    這篇文章主要為大家介紹了Go 語(yǔ)言單例模式示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-10-10
  • 詳解如何在Go項(xiàng)目中輸出版本信息

    詳解如何在Go項(xiàng)目中輸出版本信息

    這篇文章主要介紹了詳解如何在Go項(xiàng)目中輸出版本信息,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-01-01

最新評(píng)論

五华县| 玛纳斯县| 永年县| 莎车县| 固阳县| 阿瓦提县| 陆河县| 阿尔山市| 班玛县| 辽宁省| 宁海县| 麟游县| 郁南县| 连平县| 太原市| 西昌市| 屏南县| 永善县| 壶关县| 建昌县| 福贡县| 江阴市| 二手房| 侯马市| 云阳县| 八宿县| 新巴尔虎右旗| 准格尔旗| 龙泉市| 文山县| 莲花县| 苏州市| 兴安盟| 顺昌县| 开原市| 额济纳旗| 得荣县| 阿克| 安庆市| 石棉县| 武威市|