Gin 使用中间件进行全局错误处理。异常处理中间件,异常信息返回,请求响应结构体

望舒的头像
望舒 最后修改于
标签:
golangGin自定义异常处理

Gin 中使用中间件进行全局错误处理。异常处理中间件,异常信息返回

请求响应结构体

复制
import (
	"github.com/gin-gonic/gin"
	"gorm.io/gorm/utils"
	"net/http"
)

type Result[T any] struct {
	Data   T      `json:"data"`
	Code   string `json:"code"`
	Msg    string `json:"msg"`
	Status bool   `json:"status"`
}

func Success[T any](ctx *gin.Context, data T, msg string) {
	ctx.JSON(http.StatusOK, Result[T]{
		Data:   data,
		Code:   utils.ToString(http.StatusOK),
		Msg:    msg,
		Status: true,
	})
}

func SuccessData[T any](ctx *gin.Context, data T) {
	Success[T](ctx, data, "")
}

func SuccessMsg(ctx *gin.Context, msg string) {
	Success[any](ctx, nil, msg)
}

func Error[T any](ctx *gin.Context, data T, msg string) {
	ctx.JSON(http.StatusOK, Result[T]{
		Data:   data,
		Code:   utils.ToString(http.StatusInternalServerError),
		Msg:    msg,
		Status: false,
	})
}

func ErrorData[T any](ctx *gin.Context, data T) {
	Error[T](ctx, data, "")
}

func ErrorMsg(ctx *gin.Context, msg string) {
	Error[any](ctx, nil, msg)
}

异常处理中间件

复制
import (
	"blog/tool"
	"github.com/gin-gonic/gin"
	"log"
)

func ErrorResultHandle() gin.HandlerFunc {
	return func(ctx *gin.Context) {
		defer func() {
			if err := recover(); err != nil {
				log.Println(err)
				tool.ErrorMsg(ctx, "服务端异常")
				return
			}
		}()
		ctx.Next()
	}
}

中间件注册

复制
func Handler() http.Handler {
	handler := gin.Default()
	handler.Use(response.ErrorResultHandle())
	return handler
}

使用方法

复制
import (
	"blog/tool"
	"github.com/gin-gonic/gin"
	"log"
)

func Hello(ctx *gin.Context) {
	log.Panic("手动异常")
	tool.SuccessData(ctx, "hello world!")
}

使用后效果

alt
Preview
alt
Preview
‌‌‌‌‌‌‌‌​‌​‌‌​‌‌‌​​‌​​‌‌​​‌​​​​‌‌‌‌​‌‌​‌​‌‌​‌‌‌‌​‌​​​​‌​​​​‌​​​‌‌​‌‌‌‌‌‌‌‌‌‌‌​‌‌‌​‌‌‌​​‌‌‌‌​‌​‌‌‌​‌‌‌​​‌‌‌‌​‌​‌‌‌​‌‌‌​​‌‌‌‌‌‌​‌‌‌​‌‌‌​​‌‌‌​‌‌‌‌‌‌‌‌‌‌​‌‌‌‌​‌‌​‌‌‌‌‌‌‌‌‌‌‌‌​​‌‌‌‌‌‌‌‌‌‌‌‌‌‌​​‌‌‌‌‌​‌‌‌‌​‌‌‌​‌‌​‌‌‌​‌‌‌‌‌‌‌‌‌​‌​‌‌‌​‌‌‌‌‌‌‌‌​​‌‌‌‌‌​‌‌‌‌​‌‌‌​​‌‌‌‌‌‌‌‌‌‌‌‌‌‌​​‌​‌‌‌​‌‌‌​‌‌‌‌‌‌‌​‌‌‌​‌‌‌‌‌‌‌‌​​‌​‌‌‌‌‌‌‌‌‌‌‌‌‌​‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌​‌‌‌‌‌​‌‌‌​​‌‌‌​‌‌​‌‌‌​‌‌‌​​‌‌‌‌‌‌​‌‌‌​‌‌‌​​‌‌‌​​‌​‌‌‌‌‌‌‌​​‌‌‌​‌‌‌‌‌‌‌‌‌‌​​‌‌‌​‌‌‌‌‌‌‌‌‌‌​​‌‌‌‌‌‌‌‌‌‌​‌‌‌‌​‌‌‌‌​‌​‌‌‌‌‌‌‌‌‌‌‌‌​​‌​‌‌‌​‌‌‌‌​‌‌‌​‌‌‌‌‌‌​‌‌‌‌‌‌‌‌​​‌‌‌‌‌​‌‌‌‌‌‌‌‌‌​‌‌‌‌‌‌‌‌‌‌‌‌‌‌​​‌‌‌‌‌‌​‌​​‌​​‌​‌​‌​‌‌‌​​‌​​‌​‌​‌‌​‌‌‌‌‌‌‌‌‌‌​‌​‌‌​‌‌​​‌​​​‌‌‌‌​​‌​‌​‌‌​‌‌‌​​‌‌‌​​‌​​​‌​​​​‌​​​​‌​​​‌‌​‌‌‌‌‌‌‌‌‌‌‌​‌‌‌​‌‌‌​​‌‌‌‌​‌​‌‌‌​‌‌‌​​‌‌‌‌​‌​‌‌‌​‌‌‌​​‌‌‌‌‌‌​‌‌‌​‌‌‌​​‌‌‌​‌‌‌‌‌‌‌‌‌‌​‌‌‌‌​‌‌​‌‌‌‌‌‌‌‌‌‌‌‌​​‌‌‌‌‌‌‌‌‌‌‌‌‌‌​​‌‌‌‌‌​‌‌‌‌​‌‌‌​‌‌​‌‌‌​‌‌‌‌‌‌‌‌‌​‌​‌‌‌​‌‌‌‌‌‌‌‌​​‌‌‌‌‌​‌‌‌‌​‌‌‌​​‌‌‌‌‌‌‌‌‌‌‌‌‌‌​​‌​‌‌‌​‌‌‌​‌‌‌‌‌‌‌​‌‌‌​‌‌‌‌‌‌‌‌​​‌​‌‌‌‌‌‌‌‌‌‌‌‌‌​‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌​‌‌‌‌‌​‌‌‌​​‌‌‌​‌‌​‌‌‌​‌‌‌​​‌‌‌‌‌‌​‌‌‌​‌‌‌​​‌‌‌​​‌​‌‌‌‌‌‌‌​​‌‌‌​‌‌‌‌‌‌‌‌‌‌​​‌‌‌​‌‌‌‌‌‌‌‌‌‌​​‌‌‌‌‌‌‌‌‌‌​‌‌‌‌​‌‌‌‌​‌​‌‌‌‌‌‌‌‌‌‌‌‌​​‌​‌‌‌​‌‌‌‌​‌‌‌​‌‌‌‌‌‌​‌‌‌‌‌‌‌‌​​‌‌‌‌‌​‌‌‌‌‌‌‌‌‌​‌‌‌‌‌‌‌‌‌‌‌‌‌‌​​‌‌‌‌‌‌​‌​​‌​​‌​‌​‌​‌‌‌​​‌​​‌​‌​‌‌​‌‌‌‌‌‌‌‌‌‌‌‌​​‌‌‌‌‌​‌‌‌‌​‌‌‌​‌‌​‌‌‌​‌‌‌‌‌‌‌‌‌​‌​‌‌‌​‌‌‌‌‌‌‌‌​​‌‌‌‌‌​‌‌‌‌​‌‌‌​​‌‌‌‌‌‌‌‌‌‌‌‌‌‌​​‌‌‌‌‌‌‌‌‌​​‌‌‌‌​‌​‌‌‌‌‌‌‌​​‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌​‌​‌‌​‌‌‌​​​​‌‌‌‌​‌​​​‌‌‌​​​​​‌‌‌​‌​​‌‌‌‌​‌‌​‌‌​‌​‌‌‌​​​‌‌‌‌‌‌‌​​‌​​​‌​‌‌​​‌​​‌‌​​‌​​‌​​​​‌‌​​‌​​‌‌‌​‌​‌‌‌‌‌​‌​​​‌​​​‌​​​​​‌‌‌​​‌​‌‌‌​​​​​‌‌‌​‌‌‌‌​‌​​​​​‌‌‌‌‌​‌​​‌​​​​‌​‌​​​‌‌​​​‌​​​​‌​‌‌‌​‌‌‌​​​‌‌​​‌​​‌​‌‌‌‌​‌‌​​‌‌​‌​​‌​​‌‌​​‌​​​​‌‌‌‌​‌‌​‌​‌‌​‌‌‌‌​‌​‌‌​‌‌​‌​​​‌​​​‌​‌‌​‌‌​‌​‌‌‌​‌‌‌‌‌‌‌‌‌‌‌​​‌​‌‌‌‌‌‌‌‌‌‌‌‌​​‌​‌‌‌‌‌‌‌‌‌‌‌‌​​‌​‌‌‌‌‌‌‌‌‌‌​‌​‌‌​‌‌
0
0
0
238
No data