中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Golang?error使用場景是什么

發布時間:2023-03-15 11:22:17 來源:億速云 閱讀:124 作者:iii 欄目:開發技術

本篇內容主要講解“Golang error使用場景是什么”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“Golang error使用場景是什么”吧!

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

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

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

簡單易懂.

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

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

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

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

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

其實, 官方已經做好了類似的支持.

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方法來實現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)

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

調用棧

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

func getStack() {
	// 獲取當前調用棧
	pcs := make([]uintptr, 64)
	pcNum := runtime.Callers(2, pcs) // skip 2 是為了跳過 Callers 及其內部函數
	// 調用棧解析
	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)
	}
}

到此,相信大家對“Golang error使用場景是什么”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

卢湾区| 青浦区| 墨玉县| 黎川县| 嘉善县| 清水河县| 耿马| 仁化县| 宕昌县| 嘉定区| 英德市| 克拉玛依市| 鞍山市| 沂源县| 称多县| 玉屏| 武乡县| 阳东县| 古浪县| 长治市| 哈尔滨市| 北碚区| 东兴市| 项城市| 凌云县| 乐安县| 拜泉县| 赞皇县| 新营市| 资兴市| 承德县| 台湾省| 监利县| 安西县| 讷河市| 潼关县| 七台河市| 东乌| 宁安市| 名山县| 和政县|