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

Golang實踐之Error創(chuàng)建和處理詳解

 更新時間:2023年09月11日 10:18:48   作者:小雄Ya  
在 C#、Java 等語言中常常使用 try...catch的方式來捕獲異常,但是在Golang 對于錯誤處理有不同的方式,像網(wǎng)上也有很多對 error 處理的最佳實踐的文章,其中很多其實就是對 error 的統(tǒng)一封裝,使用規(guī)范進行約束,本文主要是記錄自己對處理 Error 的一些認識和學習

error 基本概念

type error interface{
    Error() string
}

Golang 中 error類型是一個具有單個方法的接口,其內置方法是返回描述錯誤的字符串。Go 語言創(chuàng)始人覺得異常機制會導致控制流程混亂,降低代碼的可讀性,所以期望異常是一種可預知的。所以在使用時應當適當?shù)姆祷?error ,然后調用方就可以更明確知道錯誤,進而再處理異常。同樣也說明了開發(fā)人員在 coding 時要能識別和預測可能發(fā)生錯誤,再進行處理,而不是忽略錯誤,

panic 和 recover

但可能也會出現(xiàn)一些我們無法預料的錯誤情況。比較嚴重的程序錯誤導致發(fā)生 panic 就會使程序結束,所以它又提供一個 recover 來捕獲 panic ,以便發(fā)生panic時能夠重新執(zhí)行啟動程序。

defer func() {
        if r := recover(); r != nil {
            fmt.Println("重新啟動程序:", r)
        }
}()

recover 函數(shù)最好在主函數(shù)中且必須在 defer 語句總使用,為了保證發(fā)生 panic 時被調用,如果沒有panic時recover 函數(shù)將會返回 nil。

對于panic 的錯誤,應當全面記錄錯誤信息,這樣才有利于排查問題。對于一些比較重要的服務應當適當增加報警機制以通知相關團隊或人員。

創(chuàng)建錯誤

// 方式1:使用 fmt.Errorof("")
func div(x, y int)(int,error){
    if y==0 {
        return 0,fmt.Errorof("除數(shù) %d 不能為0",y)
    }
    return x/y, nil
}
// 方式2: 使用errors.New("")
ErrDivByZero := errors.New("除數(shù)不能為0")
return 0,ErrDivByZero
// 方式3:使用 errors.Wrap(err, "除數(shù)不能為0")
return 0,errors.Wrap(err, "除數(shù)不能為0")

方式1中 fmt.Errorf 函數(shù)允許使用格式化字符串創(chuàng)建新錯誤。

errors.Wrap 函數(shù)允許使用上下文包裝error,使用場景:當函數(shù)調用另一個方法時遇到的錯誤而導致無法完成業(yè)務流程,那可能需要從函數(shù)返回錯誤。使用 errors.Wrap 函數(shù)需要注意:因其除了錯誤信息外還附加了堆棧信息,所以不能在程序中大量使用。

以上3種可以很簡單方便的創(chuàng)建錯誤。當然支持自定義錯誤類型,通過創(chuàng)建實現(xiàn) error 接口的新類型。例如:

// 方式4: 自定義錯誤類型
type MathCalError struct {
    message string
}
// 實現(xiàn) Error 方法
func (e *MathCalError) Error() string {
    return e.message
}
func div(x, y int) (int, error) {
    if y == 0 {
        return 0, &MathCalError{"除數(shù)不能為 0"}
    }
    return x / y, nil
}

處理錯誤

根據(jù)遇到到場景,基本對于錯誤的處理大致有下面五種情況:

  • 忽略錯誤:調用方對于發(fā)生錯誤覺得沒有任何影響,那么可以不接收直接忽略
  • 記錄錯誤并繼續(xù)執(zhí)行:調用方覺得錯誤無影響但需要進行記錄,可以接受記錄
  • 傳遞錯誤:繼續(xù)傳遞錯誤。
  • 錯誤重試:某功能錯誤需要再重試,如請求第三方接口超時時想再重試。設置重試次數(shù)限制,以防止錯誤持續(xù)存在時出現(xiàn)無限循環(huán)。
  • 嚴重錯誤終止程序:若有些錯誤期望終止程序,那直接 panic 處理。
// 忽略錯誤
result,_ := getUser()
// 記錄錯誤
result,err := getUser();err!=nil{
    log,writerInfo("something error", err.Error())
}
// 傳遞錯誤
result,err := getUser();err!=nil{
   return err
}
// 錯誤重試
retryCount := 0
 maxRetryCount := 3
for {
    result,err := getUser();
    if err!=nil{
       return err
       if retryCount >= maxRetryCount{
           return err
       } 
    }
    select {
    case <-ctx.Done():
     return ctx.Err()
    case <-time.After(time.Duration(retryCount) * time.Second):
     retryCount++
     continue
 }
}
//錯誤后直接 panic
if err := getUser(); err != nil {
    panic("something wrong") 
}

項目中使用 Error 的方案

方案一 :定義 ErrorMessage 包

項目中可以定義一個含有所有錯誤信息的包,然后在使用時直接引用。

package errorMsg
import "errors"
var UndefinedError = errors.New("未定義")
var InvalidateParamsError = errors.New("不合法參數(shù)")
// main 函數(shù)中使用
func getUser() error {
    return errorMsg.UndefinedError
}

方案二:自定義 error 類型

type ParamNotFound NotFound
type ValueNotFound NotFound
type NotFound struct {
	msg string
}
func (n *NotFound) Error() string {
	return n.msg
}
// 通過使用 switch 處理不同類型的錯誤,
func handleErrors(err error) {
  switch v := err.(type) {
  case ParamNotFound:
    fmt.Printf("ParamNotFound: %v\n", v)
  case ValueNotFound:
    fmt.Printf("ValueNotFound: %v\n", v)
  default:
    fmt.Printf("Other error: %v\n", v)
  }
}

最后

有效的錯誤處理對于構建可靠的服務至關重要,個人覺得最佳的實踐是團隊內部的統(tǒng)一規(guī)范。沒有最佳實踐和方案,只有最適合的你的場景的實踐。

以上就是Golang實踐之Error創(chuàng)建和處理詳解的詳細內容,更多關于Golang Error創(chuàng)建和處理的資料請關注腳本之家其它相關文章!

相關文章

  • Go設計模式之原型模式圖文詳解

    Go設計模式之原型模式圖文詳解

    原型模式是一種創(chuàng)建型設計模式, 使你能夠復制已有對象, 而又無需使代碼依賴它們所屬的類,本文將通過圖片和文字讓大家可以詳細的了解Go的原型模式,感興趣的通過跟著小編一起來看看吧
    2023-07-07
  • 一文詳解go閉包(Closure)使用教程

    一文詳解go閉包(Closure)使用教程

    在Go語言中,閉包(Closure)是一種特殊的函數(shù),它可以捕獲其創(chuàng)建時所在作用域中的變量,本文給大家詳細介紹了go閉包(Closure)使用教程,感興趣的朋友可以參考下
    2024-01-01
  • Golang中SSE協(xié)議實現(xiàn)方法

    Golang中SSE協(xié)議實現(xiàn)方法

    Gin框架通過Server-SentEvents(SSE)實現(xiàn)流式返回,關鍵步驟包括設置正確的響應頭、使用Flusher確保數(shù)據(jù)立即發(fā)送、處理客戶端中斷和錯誤,本文給大家介紹Golang中SSE協(xié)議實現(xiàn)方法,感興趣的朋友跟隨小編一起看看吧
    2026-01-01
  • go語言中的指針自動解引用

    go語言中的指針自動解引用

    Go語言中,編譯器會自動解引用指針來訪問字段,自動解引用使得使用指針訪問結構體字段和方法變得更加直觀,降低了編程錯誤的風險,并使代碼更易于理解和維護
    2024-10-10
  • golang實現(xiàn)ping命令的完整代碼

    golang實現(xiàn)ping命令的完整代碼

    這篇文章給大家介紹了如何使用golang實現(xiàn)ping命令,文中給大家介紹了完整的實現(xiàn)代碼,并有詳細的圖文講解,對大家的學習或工作有一定的幫助,需要的朋友可以參考下
    2024-02-02
  • Go語言開發(fā)發(fā)送Get和Post請求的示例

    Go語言開發(fā)發(fā)送Get和Post請求的示例

    這篇文章主要介紹了Go語言開發(fā)發(fā)送Get和Post請求的示例,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-07-07
  • go?colly?爬蟲實現(xiàn)示例

    go?colly?爬蟲實現(xiàn)示例

    這篇文章主要為大家介紹了go?colly?爬蟲實現(xiàn)示例,效果是根據(jù)輸入的瀏覽器cookie及excel必要行列號,從excel中讀取公司名稱,查詢公司法人及電話號碼。并寫回到excel中指定行
    2022-09-09
  • golang中之strconv包的具體使用方法

    golang中之strconv包的具體使用方法

    這篇文章主要介紹了golang中之strconv包的具體使用方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-10-10
  • Go語言中一定要知道的切片使用注意事項總結

    Go語言中一定要知道的切片使用注意事項總結

    了解和掌握切片的使用注意事項,可以避免意外的程序行為,所以本文就來和大家深入探討一下Go語言切片常見的注意事項,希望對大家有所幫助
    2023-06-06
  • golang簡單位運算示例

    golang簡單位運算示例

    這篇文章主要介紹了golang簡單位運算,包括位移運算、取反及位與位或等運算,需要的朋友可以參考下
    2016-07-07

最新評論

潼南县| 临夏县| 南京市| 济源市| 石家庄市| 隆子县| 巴马| 界首市| 额尔古纳市| 文成县| 布拖县| 诸城市| 三穗县| 西安市| 安庆市| 洛宁县| 中牟县| 平武县| 卢氏县| 甘孜县| 郧西县| 涟水县| 渝北区| 新化县| 乐安县| 咸宁市| 通化县| 乌海市| 买车| 大化| 沅江市| 城市| 梧州市| 定西市| 资源县| 扬中市| 三原县| 太仓市| 焉耆| 古蔺县| 集安市|