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

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語(yǔ)句塊

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

總結(jié)

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

相關(guān)文章

  • golang中三種線程安全的MAP小結(jié)

    golang中三種線程安全的MAP小結(jié)

    在Go語(yǔ)言中,Map是并發(fā)不安全的,本文主要介紹了golang中三種線程安全的MAP小結(jié),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2024-08-08
  • Go 1.13中errors包的新變化示例解析

    Go 1.13中errors包的新變化示例解析

    這篇文章主要為大家介紹了Go 1.13中errors包的新變化示例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-12-12
  • go語(yǔ)言實(shí)現(xiàn)一個(gè)簡(jiǎn)單的http客戶端抓取遠(yuǎn)程url的方法

    go語(yǔ)言實(shí)現(xiàn)一個(gè)簡(jiǎn)單的http客戶端抓取遠(yuǎn)程url的方法

    這篇文章主要介紹了go語(yǔ)言實(shí)現(xiàn)一個(gè)簡(jiǎn)單的http客戶端抓取遠(yuǎn)程url的方法,實(shí)例分析了Go語(yǔ)言http操作技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-03-03
  • Go語(yǔ)言讀取文件的方法小結(jié)

    Go語(yǔ)言讀取文件的方法小結(jié)

    寫程序時(shí)經(jīng)常需要從一個(gè)文件讀取數(shù)據(jù),然后輸出到另一個(gè)文件,這篇文章主要為大家詳細(xì)介紹了Go語(yǔ)言讀取文件的幾種方法,希望對(duì)大家有所幫助
    2024-01-01
  • Go語(yǔ)言中的錯(cuò)誤處理過程

    Go語(yǔ)言中的錯(cuò)誤處理過程

    Go錯(cuò)誤處理涵蓋接口、創(chuàng)建方式、檢查模式、包裝、最佳實(shí)踐及工具庫(kù),強(qiáng)調(diào)顯式檢查、簡(jiǎn)單可預(yù)測(cè)和錯(cuò)誤即值理念,提升代碼清晰度和可靠性
    2025-07-07
  • 使用Go語(yǔ)言編寫一個(gè)簡(jiǎn)單的Web框架

    使用Go語(yǔ)言編寫一個(gè)簡(jiǎn)單的Web框架

    Go語(yǔ)言(又稱Golang)因其高效的性能和簡(jiǎn)潔的語(yǔ)法,在編寫Web框架方面表現(xiàn)出色,下面將詳細(xì)介紹如何使用Go語(yǔ)言編寫一個(gè)簡(jiǎn)單的Web框架,文中有詳細(xì)的代碼供大家參考,需要的朋友可以參考下
    2024-05-05
  • go語(yǔ)言題解LeetCode506相對(duì)名次示例詳解

    go語(yǔ)言題解LeetCode506相對(duì)名次示例詳解

    這篇文章主要為大家介紹了go語(yǔ)言題解LeetCode506相對(duì)名次示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-12-12
  • 詳解Go語(yǔ)言中ErrGroup的使用

    詳解Go語(yǔ)言中ErrGroup的使用

    本文主要為大家詳細(xì)介紹了Go語(yǔ)言中errGroup的使用,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2023-07-07
  • Golang開發(fā)使用gorm時(shí)打印SQL語(yǔ)句方式

    Golang開發(fā)使用gorm時(shí)打印SQL語(yǔ)句方式

    這篇文章主要介紹了Golang開發(fā)使用gorm時(shí)打印SQL語(yǔ)句方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2025-04-04
  • Golang CSP并發(fā)機(jī)制及使用模型

    Golang CSP并發(fā)機(jī)制及使用模型

    這篇文章主要為大家介紹了Golang CSP并發(fā)機(jī)制及使用模型,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-05-05

最新評(píng)論

霍山县| 桃园县| 大兴区| 都匀市| 安多县| 扎鲁特旗| 桑日县| 沁源县| 平度市| 天全县| 黎平县| 侯马市| 仙居县| 上思县| 丹凤县| 宁南县| 武冈市| 佛坪县| 儋州市| 万山特区| 磴口县| 承德市| 马关县| 封丘县| 牡丹江市| 抚州市| 邯郸县| 古浪县| 苗栗县| 内乡县| 磐安县| 沁水县| 远安县| 湖州市| 临夏市| 莫力| 天柱县| 鄂伦春自治旗| 武安市| 北安市| 清新县|