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

golang(gin)的全局統(tǒng)一異常處理方式,并統(tǒng)一返回json

 更新時間:2024年01月16日 16:00:24   作者:劉海瓊寶寶  
這篇文章主要介紹了golang(gin)的全局統(tǒng)一異常處理方式,并統(tǒng)一返回json,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教

golang(gin)全局統(tǒng)一異常處理,并統(tǒng)一返回json

定義Recover中間件

package handler

import (
	"awesomeProject/Result"
	"github.com/gin-gonic/gin"
	"log"
	"net/http"
	"runtime/debug"
)

func Recover(c *gin.Context) {
	defer func() {
		if r := recover(); r != nil {
			//打印錯誤堆棧信息
			log.Printf("panic: %v\n", r)
			debug.PrintStack()
			//封裝通用json返回
			//c.JSON(http.StatusOK, Result.Fail(errorToString(r)))
			//Result.Fail不是本例的重點,因此用下面代碼代替
			c.JSON(http.StatusOK, gin.H{
				"code": "1",
				"msg":  errorToString(r),
				"data": nil,
			})
			//終止后續(xù)接口調(diào)用,不加的話recover到異常后,還會繼續(xù)執(zhí)行接口里后續(xù)代碼
			c.Abort()
		}
	}()
	//加載完 defer recover,繼續(xù)后續(xù)接口調(diào)用
	c.Next()
}

// recover錯誤,轉(zhuǎn)string
func errorToString(r interface{}) string {
	switch v := r.(type) {
	case error:
		return v.Error()
	default:
		return r.(string)
	}
}

使用Recover中間件

func main() {
	router := gin.Default()
	//注意 Recover 要盡量放在第一個被加載
	//如不是的話,在recover前的中間件或路由,將不能被攔截到
	//程序的原理是:
	//1.請求進(jìn)來,執(zhí)行recover
	//2.程序異常,拋出panic
	//3.panic被 recover捕獲,返回異常信息,并Abort,終止這次請求
	router.Use(handler.Recover)

	router.GET("/ping", func(c *gin.Context) {
		// 無意拋出 panic
		var slice = []int{1, 2, 3, 4, 5}
		slice[6] = 6
	})

	router.Run(":8080") // listen and serve on 0.0.0.0:8080 (for windows "localhost:8080")

}

golang中異常處理問題

程序在運行過程中如果出現(xiàn)了問題,可以通過拋出異常、捕獲異常來進(jìn)行異常的處理,在golang中,異常的接口為error:

type error interface {
    Error() string
}

因此,只要一個結(jié)構(gòu)體實現(xiàn)了Error() string方法,就是實現(xiàn)了error接口:

type MyError struct {

}
func (err *MyError)Error() string{
    return "this is MyError"
}

golang中可以通過panic來拋出異常,recover來捕獲異常。如果不處理異常,最終會是程序整個退出

另外**捕獲異常必須在defer中進(jìn)行捕獲,否則捕獲異常recover不起作用**

type MyError struct {

}
func (err *MyError)Error() string{
    return "this is MyError"
}

func PanicError()  {
    fmt.Println("panic error")
    panic(MyError{})
}

func main() {
    defer func(){
        if err := recover() ; err != nil {

            fmt.Println("catch error ",err)
        }
    }()

    PanicError()
}

defer的機(jī)制,有點類似于java中的finall語句塊

go中多個defer語句與defer的順序相反執(zhí)行,可以理解是將defer放入到一個先進(jìn)后出的隊列中

總結(jié)

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • Golang 錯誤捕獲Panic與Recover的使用

    Golang 錯誤捕獲Panic與Recover的使用

    對于Go語言的錯誤是通過返回值的方式,本文主要介紹了Golang 錯誤捕獲Panic與Recover的使用,文中根據(jù)實例編碼詳細(xì)介紹的十分詳盡,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • 深入淺出Go:掌握基礎(chǔ)知識的關(guān)鍵要點

    深入淺出Go:掌握基礎(chǔ)知識的關(guān)鍵要點

    Go是一種開源的編程語言,由Google開發(fā),它具有簡潔、高效、并發(fā)性強(qiáng)的特點,適用于構(gòu)建可靠的、高性能的軟件系統(tǒng),本文將介紹Go的基礎(chǔ)知識,需要的朋友可以參考下
    2023-10-10
  • golang?pprof監(jiān)控memory?block?mutex使用指南

    golang?pprof監(jiān)控memory?block?mutex使用指南

    這篇文章主要為大家介紹了golang?pprof監(jiān)控memory?block?mutex使用指南,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-04-04
  • 如何使用騰訊云go sdk 查詢對象存儲中最新文件

    如何使用騰訊云go sdk 查詢對象存儲中最新文件

    這篇文章主要介紹了使用騰訊云go sdk 查詢對象存儲中最新文件,這包括如何創(chuàng)建COS客戶端,如何逐頁檢索對象列表,并如何對結(jié)果排序以找到最后更新的對象,我們還展示了如何優(yōu)化用戶體驗,通過實時進(jìn)度更新和檢索多個文件來改進(jìn)程序,需要的朋友可以參考下
    2024-03-03
  • go開源Hugo站點渲染之模板詞法解析

    go開源Hugo站點渲染之模板詞法解析

    這篇文章主要為大家介紹了go開源Hugo站點渲染之模板詞法解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-02-02
  • 解讀golang plugin熱更新嘗試

    解讀golang plugin熱更新嘗試

    這篇文章主要介紹了解讀golang plugin熱更新嘗試,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-04-04
  • Go語言通道之緩沖通道

    Go語言通道之緩沖通道

    這篇文章介紹了Go語言通道之緩沖通道,文中通過示例代碼介紹的非常詳細(xì)。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-07-07
  • Go routine使用方法講解

    Go routine使用方法講解

    goroutine是Go語言提供的語言級別的輕量級線程,在我們需要使用并發(fā)時,我們只需要通過go關(guān)鍵字來開啟goroutine即可。這篇文章主要介紹了GoLang并發(fā)機(jī)制goroutine原理,感興趣的可以了解一下
    2023-01-01
  • go?defer延遲調(diào)用的使用場景示例詳解

    go?defer延遲調(diào)用的使用場景示例詳解

    這篇文章主要為大家介紹了go?defer延遲調(diào)用的使用場景示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-05-05
  • Golang構(gòu)建WebSocket服務(wù)器和客戶端的示例詳解

    Golang構(gòu)建WebSocket服務(wù)器和客戶端的示例詳解

    這篇文章主要為大家詳細(xì)介紹了如何使用Go語言構(gòu)建WebSocket服務(wù)器和客戶端,以實現(xiàn)雙向通信,文中的示例代碼講解詳細(xì),需要的小伙伴可以參考一下
    2023-11-11

最新評論