欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Go語言中的錯誤處理最佳實踐詳解

 更新時間:2023年08月29日 12:00:21   作者:Alan_w  
這篇文章主要為大家詳細介紹了Go語言中的錯誤處理的相關知識,文中的示例代碼講解詳細,對我們深入了解Go語言有一定的幫助,需要的可以參考下

錯誤處理實踐

我們在go語言中設計error的處理體系時候, 一般都會去做下面兩點

  • 直接使用errors.New()生成error接口的值
  • 擴展error接口, 并定義擴展error接口的實現(xiàn)類型

error接口是什么

go語言的error是一個接口類型, 其源碼如下:

type error interface {
	Error() string
}

我們可以定義它的實現(xiàn)類型, 比如我們經(jīng)常使用到的errors.New()方法, 返回值為一個error接口的實現(xiàn)類型*errorString的結構體字面量

package errors
func New(text string) error {
	return &errorString{text}
}
type errorString struct {
	s string
}
func (e *errorString) Error() string {
	return e.s
}
//package main
xxxerr := errors.New("xxx")

所以我們可以直接調用errors.New()為我們生成一個error接口的值

擴展的error接口

我們?yōu)槭裁葱枰獙rror接口進行擴展呢?, 原因是error的實現(xiàn)類型范圍太大了, 細粒度不夠小, 所以我們需要實現(xiàn)更加精細的控制, 關于這種設計我們可以參考go語言標準庫中的一些error處理代碼, 比如下面的net.Error

type Error interface {
	//嵌入了error接口, 實現(xiàn)net.Error也會實現(xiàn)error
    error
    //擴展
    Timeout() bool
    Temporary() bool
}

然后我們又可以定義一個類型來實現(xiàn)這個擴展錯誤接口類型, 比如下面這個OpError:

type OpError struct {
	Op string
	Net string
	Source Addr
	Addr Addr
	Err error
}
//實現(xiàn)函數(shù)1
func (e *OpError) Error() string {
	return ""
}
//下面是實現(xiàn)函數(shù)2
func (e *OpError) Timeout() bool {
	//對應的處理邏輯
    return true
}
//下面是實現(xiàn)函數(shù)2
func (e *OpError) Temporary() bool {}

我們發(fā)現(xiàn)該結構體中存在一個名字叫做Err的類型為error的字段, 它代表了該錯誤的潛在錯誤, 有可能OpError類型的錯誤值還包含了AddrError這種錯誤

通過這種類型建立起樹形的錯誤體系, 用統(tǒng)一字段建立可追溯的鏈式錯誤關聯(lián), 我們就可以建立起來一套優(yōu)秀的錯誤處理機制

為了更好的表示, 我畫了一張圖

具體的錯誤

因為Go語言的error是一個接口, 所以這個它的值的實際類型是非常復雜的, 于是我們就需要去判斷它的值的一個實際類型

  • 如果錯誤值在某一個范圍內, 我們可以使用類型斷言表達式或者類型斷言+switch語句進行判斷
  • 對于已有相應變量且類型相同的一系列錯誤值, 一般直接使用判等操作 + switch語句
  • 沒有相應變量且類型未知的一系列錯誤值, 只能使用其錯誤信息的字符串表示形式來判斷

下面我們分別來看上面的內容: 首先是第一點, 已知錯誤值的范圍比如: {os.PathError|os.LinkError|os.SyscallError|exec.Error}, 是它們中的一個, 我們可以直接使用類型斷言+switch, 然后返回潛在錯誤類型

func underlyingError(err error) error {
  switch err := err.(type) {
  case *os.PathError:
    return err.Err
  case *os.LinkError:
    return err.Err
  case *os.SyscallError:
    return err.Err
  case *exec.Error:
    return err.Err
  }
  return err
}

當我已經(jīng)知道某個錯誤是哪一個, 我們直接使用判等操作+switch,

printError := func(i int, err error) {
    if err == nil {
        fmt.println("nil error")
        return
    }
    err = underlyingError(err)
    switch err {  
    case os.ErrClosed:    
        fmt.Printf("error(closed)[%d]: %s\n", i, err)  
    case os.ErrInvalid:    
        fmt.Printf("error(invalid)[%d]: %s\n", i, err)  
    case os.ErrPermission:    
        fmt.Printf("error(permission)[%d]: %s\n", i, err)  
    }
}

通過上面這種直接判等操作, 我們就可以鎖定具體的錯誤值了

對于上面兩種情況, 我們都會有比較明確的方法去解決, 但是我們對一個錯誤值可能代表的含義知道的很少, 那么就只能通過錯誤信息去判斷了

到此這篇關于Go語言中的錯誤處理最佳實踐詳解的文章就介紹到這了,更多相關Go錯誤處理內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • Go語言學習筆記之文件讀寫操作詳解

    Go語言學習筆記之文件讀寫操作詳解

    這篇文章主要為大家詳細介紹了Go語言對文件進行讀寫操作的方法,文中的示例代碼講解詳細,對我們學習Go語言有一定的幫助,需要的可以參考一下
    2022-05-05
  • 一文詳解Golang協(xié)程調度器scheduler

    一文詳解Golang協(xié)程調度器scheduler

    這篇文章主要介紹了一文詳解Golang協(xié)程調度器scheduler,文章圍繞主題展開詳細的內容介紹,具有一定的參考價值,需要的朋友可以參考一下
    2022-07-07
  • golang中l(wèi)og包自定義輸出日志格式與寫入到文件

    golang中l(wèi)og包自定義輸出日志格式與寫入到文件

    這篇文章主要給大家介紹了關于golang中l(wèi)og包自定義輸出日志格式與寫入到文件的相關資料,日志輸出在任何項目中都極其重要,是有助于后續(xù)我們排查解決程序BUG,需要的朋友可以參考下
    2023-06-06
  • go kratos源碼及配置解析

    go kratos源碼及配置解析

    這篇文章主要為大家介紹了go kratos源碼及配置解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-12-12
  • goland配置自動注釋的實現(xiàn)

    goland配置自動注釋的實現(xiàn)

    本文主要介紹了goland配置自動注釋的實現(xiàn),文中通過圖文示例介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2024-08-08
  • 使用Golong實現(xiàn)JWT身份驗證的詳細過程

    使用Golong實現(xiàn)JWT身份驗證的詳細過程

    JWT提供了一種強大而靈活的方法來處理Web應用程序中的身份驗證和授權,本教程將引導您逐步實現(xiàn)Go應用程序中的JWT身份驗證過程,感興趣的朋友跟隨小編一起看看吧
    2024-03-03
  • golang如何用http.NewRequest創(chuàng)建get和post請求

    golang如何用http.NewRequest創(chuàng)建get和post請求

    這篇文章主要介紹了golang如何用http.NewRequest創(chuàng)建get和post請求問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-03-03
  • golang logrus日志框架實例詳解

    golang logrus日志框架實例詳解

    logrus是一個可插拔的、結構化的日志框架,這篇文章主要介紹了golang logrus日志框架實例代碼,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-08-08
  • 模塊一 GO語言基礎知識-庫源碼文件

    模塊一 GO語言基礎知識-庫源碼文件

    這篇文章主要介紹了模塊一 GO語言基礎知識-庫源碼文件,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-01-01
  • 深入解析golang編程中函數(shù)的用法

    深入解析golang編程中函數(shù)的用法

    這篇文章主要介紹了golang編程中函數(shù)的用法,是Go語言入門學習中的基礎知識,需要的朋友可以參考下
    2015-10-10

最新評論