package middleware import ( "github.com/gin-gonic/gin" "log" "net/http" "runtime/debug" "ulink-admin/frame" ) func Recover(c *frame.Context) { defer func() { if r := recover(); r != nil { //打印错误堆栈信息 log.Printf("panic: %v\n", r) debug.PrintStack() errorToString(c, r) //终止后续接口调用,不加的话recover到异常后,还会继续执行接口里后续代码 c.Abort() } }() //加载完 defer recover,继续后续接口调用 c.Next() } // recover错误,转string func errorToString(c *frame.Context, r interface{}) { switch v := r.(type) { case error: c.JSON(http.StatusOK, gin.H{ "status": 500, "msg": v.Error(), "data": nil, }) case frame.Exception: c.JSON(http.StatusOK, gin.H{ "status": v.Status, "msg": v.Msg, "data": nil, }) default: c.JSON(http.StatusOK, gin.H{ "status": 500, "msg": v.(string), "data": nil, }) } }