golang(gin)のグローバル統一異常処理は、jsonに統一的に戻ります。
8027 ワード
1.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
", 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,
})
// , recover ,
c.Abort()
}
}()
// defer recover,
c.Next()
}
// recover , string
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
//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")
}