2023年11月29日发(作者:)

golanggin)的全局统⼀异常处理,并统⼀返回json

1.定义Recover中间件

package handler

import (

"awesomeProject/Result"

"/gin-gonic/gin"

"log"

"net/http"

"runtime/debug"

)

func Recover(c *gin.Context) {

defer func() {

if r := recover(); r != nil {

//

打印错误堆栈信息

log.Printf("panic: %vn", r)

debug.PrintStack()

//json

封装通⽤返回

//(OK, (errorToString(r)))

//

不是本例的重点,因此⽤下⾯代码代替

c.JSON(http.StatusOK, gin.H{

"code": "1",

"msg": errorToString(r),

"data": nil,

})

//recover

终⽌后续接⼝调⽤,不加的话到异常后,还会继续执⾏接⼝⾥后续代码

c.Abort()

}

}()

// defer recover

加载完,继续后续接⼝调⽤

c.Next()

}

// recoverstring

错误,转

func errorToString(r interface{}) string {

switch v := r.(type) {

case error:

return v.Error()

default:

return r.(string)

}

}

2.使⽤Recover中间件

func main() {

router := gin.Default()

// Recover

注意要尽量放在第⼀个被加载

//recover

如不是的话,在前的中间件或路由,将不能被拦截到

//

程序的原理是:

//1.recover

请求进来,执⾏

//2.panic

程序异常,抛出

// recoverAbort,

捕获,返回异常信息,并终⽌这次请求

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")

}