errorPlugin.go 4.2 KB

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