package middleware import ( "log/slog" "net/http" "runtime/debug" "github.com/gin-gonic/gin" ) // Recovery 捕获 handler 中的 panic,记录结构化日志并以 500 响应, // 符合规范:recover 仅允许用于框架中间件。 func Recovery() gin.HandlerFunc { return func(c *gin.Context) { defer func() { if r := recover(); r != nil { slog.Error("panic recovered", slog.String("path", c.Request.URL.Path), slog.Any("err", r), slog.String("stack", string(debug.Stack())), ) c.AbortWithStatusJSON(http.StatusInternalServerError, gin.H{ "code": 50000, "msg": "internal server error", "data": nil, }) } }() c.Next() } }