error.go 5.1 KB

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