error.go 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142
  1. package myerrors
  2. import (
  3. "context"
  4. "github.com/gogf/gf/errors/gcode"
  5. "github.com/gogf/gf/errors/gerror"
  6. "github.com/gogf/gf/frame/g"
  7. "github.com/gogf/gf/util/gconv"
  8. "github.com/smallnest/rpcx/protocol"
  9. "strings"
  10. )
  11. var (
  12. CodeTipsErr = gcode.New(1001, "错误提示", nil)
  13. CodeValidErr = gcode.New(1002, "数据校验失败", nil)
  14. CodeQueryErr = gcode.New(1003, "%s查询失败", nil)
  15. CodeCreateErr = gcode.New(1004, "%s创建失败", nil)
  16. CodeUpdateErr = gcode.New(1005, "%s更新失败", nil)
  17. CodeDeleteErr = gcode.New(1006, "%s删除失败", nil)
  18. CodeAuthErr = gcode.New(1010, "登录失效或认证失败,请重新尝试", nil)
  19. CodePermErr = gcode.New(1011, "权限验证失败,请重新尝试", nil)
  20. CodeMicroCallErr = gcode.New(1100, "微服务调用失败,请重新尝试", nil)
  21. CodeConvErr = gcode.New(1200, "数据转换异常,请重新尝试", nil)
  22. CodeDbErr = gcode.New(1201, "数据库操作异常,请重新尝试", nil)
  23. CodeSysErr = gcode.New(500, "系统异常,请重新尝试", nil)
  24. )
  25. // func New(errCode int, err error, errMsg ...string) error {
  26. // if err == nil {
  27. // return gerror.NewCode(errCode, handleErrMsg(ConvErr, errMsg...))
  28. // }
  29. // return gerror.WrapCode(errCode, err, handleErrMsg(ConvErr, errMsg...))
  30. // }
  31. func TipsError(errMsg string) error {
  32. return gerror.NewCode(CodeTipsErr, errMsg)
  33. }
  34. func ValidError(errMsg ...string) error {
  35. return gerror.NewCode(CodeValidErr, handleErrMsg(CodeValidErr, errMsg...))
  36. }
  37. func QueryError(err error, module string) error {
  38. return gerror.WrapCodef(CodeQueryErr, err, CodeQueryErr.Message(), module)
  39. }
  40. func CreateError(err error, module string) error {
  41. return gerror.WrapCodef(CodeCreateErr, err, CodeCreateErr.Message(), module)
  42. }
  43. func UpdateError(err error, module string) error {
  44. return gerror.WrapCodef(CodeUpdateErr, err, CodeUpdateErr.Message(), module)
  45. }
  46. func DeleteError(err error, module string) error {
  47. return gerror.WrapCodef(CodeDeleteErr, err, CodeDeleteErr.Message(), module)
  48. }
  49. func AuthError(errMsg ...string) error {
  50. return gerror.NewCode(CodeAuthErr, handleErrMsg(CodeAuthErr, errMsg...))
  51. }
  52. func PermError(errMsg ...string) error {
  53. return gerror.NewCode(CodePermErr, handleErrMsg(CodePermErr, errMsg...))
  54. }
  55. func MicroCallError(errMsg ...string) error {
  56. return gerror.NewCode(CodeMicroCallErr, handleErrMsg(CodeMicroCallErr, errMsg...))
  57. }
  58. func ConvError(errMsg ...string) error {
  59. return gerror.NewCode(CodeConvErr, handleErrMsg(CodeConvErr, errMsg...))
  60. }
  61. func DbError(errMsg ...string) error {
  62. return gerror.NewCode(CodeDbErr, handleErrMsg(CodeDbErr, errMsg...))
  63. }
  64. func SysError() error {
  65. return gerror.NewCode(CodeSysErr, CodeSysErr.Message())
  66. }
  67. func handleErrMsg(errCode gcode.Code, errMsg ...string) string {
  68. msg := errCode.Message()
  69. if len(errMsg) > 0 {
  70. msg = errCode.Message() + ": " + strings.Join(errMsg, ", ")
  71. }
  72. return msg
  73. }
  74. type HandleErrorPlugin struct{}
  75. func (p HandleErrorPlugin) PreWriteResponse(ctx context.Context, req *protocol.Message, res *protocol.Message, err error) error {
  76. if err == nil {
  77. // todo 正常数据处理
  78. resData := gconv.Map(res.Payload)
  79. resData["code"] = 200
  80. if val, ok := resData["msg"]; !ok || val == "" {
  81. resData["msg"] = "操作成功"
  82. }
  83. res.Payload = gconv.Bytes(gconv.String(resData))
  84. return nil
  85. }
  86. // error 堆栈信息输出
  87. g.Log().Error(gerror.Stack(err))
  88. topCode := gerror.Code(err).Code()
  89. if topCode > 0 {
  90. // 默认返回系统级异常处理
  91. var resData = g.Map{
  92. "code": CodeSysErr.Code(),
  93. "msg": CodeSysErr.Message(),
  94. }
  95. // 检查是否存在二级错误,如存在取底层错误信息
  96. gNextError := gerror.Next(err)
  97. nextErrCode := topCode
  98. if gNextError != nil {
  99. nextErrCode = gerror.Code(gNextError).Code()
  100. }
  101. switch true {
  102. case nextErrCode > 1000:
  103. // 业务级异常处理
  104. resData = g.Map{
  105. "code": topCode,
  106. "msg": err,
  107. }
  108. case nextErrCode > 0 && topCode > 1000:
  109. // 检查是否存在业务信息,添加显示
  110. resData = g.Map{
  111. "code": topCode,
  112. "msg": splitErrorStr(err.Error()),
  113. }
  114. case nextErrCode == 51:
  115. // 检查是否存在业务信息,添加显示
  116. resData = g.Map{
  117. "code": CodeValidErr.Code(),
  118. "msg": CodeValidErr.Message() + ": " + err.Error(),
  119. }
  120. default:
  121. }
  122. res.Payload = gconv.Bytes(gconv.String(resData))
  123. res.SetMessageStatusType(protocol.Normal)
  124. if res.Metadata != nil {
  125. delete(res.Metadata, protocol.ServiceError)
  126. }
  127. }
  128. return nil
  129. }
  130. func splitErrorStr(errMsg string) string {
  131. errStrIndex := strings.Index(errMsg, ": ")
  132. return errMsg[:errStrIndex] + ": " + CodeSysErr.Message()
  133. }