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

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

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

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

// recover錯(cuò)誤,轉(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 要盡量放在第一個(gè)被加載
	//如不是的話,在recover前的中間件或路由,將不能被攔截到
	//程序的原理是:
	//1.請(qǐng)求進(jìn)來,執(zhí)行recover
	//2.程序異常,拋出panic
	//3.panic被 recover捕獲,返回異常信息,并Abort,終止這次請(qǐng)求
	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中異常處理問題

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

type error interface {
    Error() string
}

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

type MyError struct {

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

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

另外**捕獲異常必須在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ī)制,有點(diǎn)類似于java中的finall語句塊

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

總結(jié)

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

相關(guān)文章

  • golang端口占用檢測(cè)的使用

    golang端口占用檢測(cè)的使用

    這篇文章主要介紹了golang端口占用檢測(cè)的使用,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-03-03
  • Go語言中validation庫不能校驗(yàn)零值問題的解決方法

    Go語言中validation庫不能校驗(yàn)零值問題的解決方法

    在使用 Gin 框架的時(shí)候,前后端傳遞數(shù)據(jù)的時(shí)候,比如使用 JSON 格式,通常會(huì)使用 ShouldBindJSON 去用結(jié)構(gòu)體打 tag 綁定前端傳來的 JSON 格式數(shù)據(jù),本文給大家介紹了Go語言中validation庫不能校驗(yàn)零值問題的解決方法,需要的朋友可以參考下
    2024-08-08
  • 詳解Golang中使用map時(shí)的注意問題

    詳解Golang中使用map時(shí)的注意問題

    Golang中的map是一種數(shù)據(jù)結(jié)構(gòu),它允許你使用鍵值對(duì)的形式存儲(chǔ)和訪問數(shù)據(jù),map在Go中是非排序的,提供了高效查找、插入和刪除元素的能力,特別是當(dāng)鍵是不可變類型,本文給大家詳細(xì)介紹了Golang中使用map時(shí)的注意問題,需要的朋友可以參考下
    2024-06-06
  • RoaringBitmap原理及在Go中的使用詳解

    RoaringBitmap原理及在Go中的使用詳解

    這篇文章主要為大家介紹了RoaringBitmap原理及在Go中的使用詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-02-02
  • Go語言中interface語法與使用詳解

    Go語言中interface語法與使用詳解

    Go語言里面設(shè)計(jì)最精妙的應(yīng)該算interface,它讓面向?qū)ο?內(nèi)容組織實(shí)現(xiàn)非常的方便,下面這篇文章主要給大家介紹了關(guān)于Go語言中interface語法與使用的相關(guān)資料,需要的朋友可以參考下
    2022-07-07
  • Golang打印復(fù)雜結(jié)構(gòu)體兩種方法詳解

    Golang打印復(fù)雜結(jié)構(gòu)體兩種方法詳解

    在?Golang?語言開發(fā)中,我們經(jīng)常會(huì)使用結(jié)構(gòu)體類型,如果我們使用的結(jié)構(gòu)體類型的變量包含指針類型的字段,我們?cè)谟涗浫罩镜臅r(shí)候,指針類型的字段的值是指針地址,將會(huì)給我們?debug?代碼造成不便
    2022-10-10
  • Go操作Kafka的實(shí)現(xiàn)示例(kafka-go)

    Go操作Kafka的實(shí)現(xiàn)示例(kafka-go)

    本文介紹了使用kafka-go庫在Go語言中與Kafka進(jìn)行交互,涵蓋了kafka-go的安裝、API使用、消息發(fā)送與消費(fèi)方法,以及如何通過DockerCompose快速搭建Kafka環(huán)境,文章還比較了其他兩個(gè)常用的Kafka客戶端庫,感興趣的可以了解一下
    2024-10-10
  • Go壓縮位圖庫roaring安裝使用詳解

    Go壓縮位圖庫roaring安裝使用詳解

    這篇文章主要為大家介紹了Go壓縮位圖庫roaring安裝使用詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-07-07
  • 使用Go語言實(shí)現(xiàn)發(fā)送HTTP請(qǐng)求并給GET添加參數(shù)

    使用Go語言實(shí)現(xiàn)發(fā)送HTTP請(qǐng)求并給GET添加參數(shù)

    在開發(fā)Web應(yīng)用程序時(shí),我們經(jīng)常需要向服務(wù)器發(fā)送HTTP請(qǐng)求,本文將介紹一下使用Go語言發(fā)送HTTP請(qǐng)求,并給GET請(qǐng)求添加參數(shù)的方法,感興趣的小伙伴可以了解一下
    2023-07-07
  • Golang實(shí)現(xiàn)心跳機(jī)制的示例詳解

    Golang實(shí)現(xiàn)心跳機(jī)制的示例詳解

    這篇文章主要為大家詳細(xì)介紹了Golang實(shí)現(xiàn)心跳機(jī)制的相關(guān)知識(shí),文中的示例代碼講解詳細(xì),具有一定的借鑒價(jià)值,有需要的小伙伴可以參考一下
    2024-04-04

最新評(píng)論