亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Golang error使用場景介紹

 更新時間:2023年03月15日 10:57:13   作者:煙草的香味.  
我們在使用Golang時,不可避免會遇到異常情況的處理,與Java、Python等語言不同的是,Go中并沒有try...catch...這樣的語句塊,這個時候我們?nèi)绾尾拍芨玫奶幚懋惓D??本文來教你正確方法

前言

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

長久以來, 我的使用方式都是這樣的:

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

簡單易懂.

但是, 如果我們的調(diào)用鏈是這樣的func1 -> func2 -> func3 -> func4 -> func5, 此時func5發(fā)生錯誤, error逐層向上傳遞, func1拿到錯誤后, 因為缺少堆棧信息, 很難根據(jù)error還原出錯場景.

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

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

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

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

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

error

Gofmt庫中有這樣一個error:

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

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

官方對其的使用進行了封裝, 包含了:

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

翻了翻幾個方法的源碼都比較簡單, 在這里就不細述了.

調(diào)用棧

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

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

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

相關(guān)文章

  • 安裝Sublime?Text支持Go插件的方法步驟

    安裝Sublime?Text支持Go插件的方法步驟

    本文主要介紹了安裝Sublime?Text支持Go插件的方法步驟,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-01-01
  • GORM不定參數(shù)的用法最佳實踐

    GORM不定參數(shù)的用法最佳實踐

    這篇文章主要為大家介紹了GORM不定參數(shù)的用法最佳實踐,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-12-12
  • Go語言實現(xiàn)websocket推送程序

    Go語言實現(xiàn)websocket推送程序

    這篇文章主要介紹了Go語言實現(xiàn)websocket推送程序,WebSocket是基于TCP的一個雙向傳輸數(shù)據(jù)的協(xié)議,和HTTP協(xié)議一樣,是在應用層的,他的出現(xiàn),是為了解決網(wǎng)頁進行持久雙向傳輸數(shù)據(jù)的問題
    2023-01-01
  • 利用GO語言實現(xiàn)多人聊天室實例教程

    利用GO語言實現(xiàn)多人聊天室實例教程

    聊天室的實現(xiàn)大家應該都遇到過,這篇文章主要給大家介紹了關(guān)于利用GO語言實現(xiàn)多人聊天室的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面來一起看看吧。
    2018-03-03
  • 分析Go錯誤處理優(yōu)化go?recover機制缺陷

    分析Go錯誤處理優(yōu)化go?recover機制缺陷

    這篇文章主要為大家介紹了分析Go錯誤處理優(yōu)化go?recover機制缺陷示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-07-07
  • Go 使用Unmarshal將json賦給struct出錯的原因及解決

    Go 使用Unmarshal將json賦給struct出錯的原因及解決

    這篇文章主要介紹了Go 使用Unmarshal將json賦給struct出錯的原因及解決方案,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-03-03
  • Go語言實現(xiàn)JSON解析的神器詳解

    Go語言實現(xiàn)JSON解析的神器詳解

    php轉(zhuǎn)go是大趨勢,越來越多公司的php服務都在用go進行重構(gòu),重構(gòu)過程中,會發(fā)現(xiàn)php的json解析操作是真的香。本文和大家分享了一個Go語言實現(xiàn)JSON解析的神器,希望對大家有所幫助
    2023-01-01
  • 關(guān)于golang中平行賦值淺析

    關(guān)于golang中平行賦值淺析

    這篇文章主要給大家介紹了關(guān)于golang中平行賦值的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家學習或者使用golang具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2018-08-08
  • 一文帶你吃透Golang中net/http標準庫服務端

    一文帶你吃透Golang中net/http標準庫服務端

    這篇文章將從服務端(Server)作為切入點和大家分享一下Go語言net/http標準庫的實現(xiàn)邏輯,進而一步步分析http標準庫內(nèi)部是如何運作的,感興趣的可以了解下
    2024-03-03
  • 詳解golang開發(fā)中http請求redirect的問題

    詳解golang開發(fā)中http請求redirect的問題

    這篇文章主要介紹了詳解golang開發(fā)中http請求redirect的問題,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-10-10

最新評論