recover.go 899 B

12345678910111213141516171819202122232425262728293031323334353637383940414243
  1. package middleware
  2. import (
  3. "gadmin/utility/serializer"
  4. "github.com/gin-gonic/gin"
  5. "github.com/sirupsen/logrus"
  6. "runtime/debug"
  7. )
  8. // Recover 异常接管
  9. func Recover(c *gin.Context) {
  10. defer func() {
  11. if r := recover(); r != nil {
  12. //打印错误堆栈信息
  13. logrus.Errorf("middleware recover: %v \n stack:%v \n", r, string(debug.Stack()))
  14. msg := errorToString(r)
  15. //// 生产环境隐藏报错
  16. //if gin.Mode() == gin.ReleaseMode {
  17. // msg = "服务器居然开小差了,请稍后再试吧!"
  18. //}
  19. serializer.JSONErrorExit(c, msg)
  20. c.Abort()
  21. }
  22. }()
  23. c.Next()
  24. }
  25. // recover错误,转string
  26. func errorToString(r interface{}) string {
  27. switch v := r.(type) {
  28. case error:
  29. return v.Error()
  30. case *logrus.Entry:
  31. str, err := r.(*logrus.Entry).String()
  32. if err != nil {
  33. return "recover错误:" + err.Error()
  34. }
  35. return str
  36. default:
  37. return r.(string)
  38. }
  39. }