recover.go 948 B

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748
  1. package middleware
  2. import (
  3. "github.com/gin-gonic/gin"
  4. "log"
  5. "net/http"
  6. "runtime/debug"
  7. "ulink-admin/frame"
  8. )
  9. func Recover(c *frame.Context) {
  10. defer func() {
  11. if r := recover(); r != nil {
  12. //打印错误堆栈信息
  13. log.Printf("panic: %v\n", r)
  14. debug.PrintStack()
  15. errorToString(c, r)
  16. //终止后续接口调用,不加的话recover到异常后,还会继续执行接口里后续代码
  17. c.Abort()
  18. }
  19. }()
  20. //加载完 defer recover,继续后续接口调用
  21. c.Next()
  22. }
  23. // recover错误,转string
  24. func errorToString(c *frame.Context, r interface{}) {
  25. switch v := r.(type) {
  26. case error:
  27. c.JSON(http.StatusOK, gin.H{
  28. "status": 500,
  29. "msg": v.Error(),
  30. "data": nil,
  31. })
  32. case frame.Exception:
  33. c.JSON(http.StatusOK, gin.H{
  34. "status": v.Status,
  35. "msg": v.Msg,
  36. "data": nil,
  37. })
  38. default:
  39. c.JSON(http.StatusOK, gin.H{
  40. "status": 500,
  41. "msg": v.(string),
  42. "data": nil,
  43. })
  44. }
  45. }