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

}