35 lines
		
	
	
		
			645 B
		
	
	
	
		
			Go
		
	
	
	
			
		
		
	
	
			35 lines
		
	
	
		
			645 B
		
	
	
	
		
			Go
		
	
	
	
package middleware
 | 
						|
 | 
						|
import (
 | 
						|
	"fmt"
 | 
						|
	"log"
 | 
						|
	"runtime/debug"
 | 
						|
 | 
						|
	"github.com/gin-gonic/gin"
 | 
						|
)
 | 
						|
 | 
						|
// Recovery is a middleware that recovers from panics
 | 
						|
func Recovery() gin.HandlerFunc {
 | 
						|
	return func(c *gin.Context) {
 | 
						|
		defer func() {
 | 
						|
			if err := recover(); err != nil {
 | 
						|
				// Get request ID
 | 
						|
				requestID, _ := c.Get("RequestID")
 | 
						|
 | 
						|
				// Print stacktrace
 | 
						|
				stacktrace := debug.Stack()
 | 
						|
				// Log error
 | 
						|
				log.Printf("[PANIC] %s | %v | %s", requestID, err, stacktrace)
 | 
						|
 | 
						|
				// 返回500错误
 | 
						|
				c.AbortWithStatusJSON(500, gin.H{
 | 
						|
					"error":   "Internal Server Error",
 | 
						|
					"message": fmt.Sprintf("%v", err),
 | 
						|
				})
 | 
						|
			}
 | 
						|
		}()
 | 
						|
 | 
						|
		c.Next()
 | 
						|
	}
 | 
						|
}
 |