error.go 5.8 KB

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