2023年11月29日发(作者:)
golang(gin)的全局统⼀异常处理,并统⼀返回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")
}


发布评论