recover.go 865 B

123456789101112131415161718192021222324252627282930313233343536373839
  1. package logger
  2. import (
  3. "github.com/gin-gonic/gin"
  4. "net/http"
  5. "runtime/debug"
  6. )
  7. func Recover(c *gin.Context) {
  8. defer func() {
  9. if r := recover(); r != nil {
  10. //打印错误堆栈信息
  11. Logger.Errorf("panic: %v\n", r)
  12. debug.PrintStack()
  13. //封装通用json返回
  14. //c.JSON(http.StatusOK, Result.Fail(errorToString(r)))
  15. //Result.Fail不是本例的重点,因此用下面代码代替
  16. c.JSON(http.StatusOK, gin.H{
  17. "code": 500,
  18. "msg": errorToString(r),
  19. "data": nil,
  20. })
  21. //终止后续接口调用,不加的话recover到异常后,还会继续执行接口里后续代码
  22. c.Abort()
  23. }
  24. }()
  25. //加载完 defer recover,继续后续接口调用
  26. c.Next()
  27. }
  28. // recover错误,转string
  29. func errorToString(r interface{}) string {
  30. switch v := r.(type) {
  31. case error:
  32. return v.Error()
  33. default:
  34. return r.(string)
  35. }
  36. }