package myerrors import ( "context" "github.com/gogf/gf/errors/gcode" "github.com/gogf/gf/errors/gerror" "github.com/gogf/gf/frame/g" "github.com/gogf/gf/util/gconv" "github.com/smallnest/rpcx/protocol" "strings" ) var ( CodeTipsErr = gcode.New(1001, "错误提示", nil) CodeValidErr = gcode.New(1002, "数据校验失败", nil) CodeQueryErr = gcode.New(1003, "%s查询失败", nil) CodeCreateErr = gcode.New(1004, "%s创建失败", nil) CodeUpdateErr = gcode.New(1005, "%s更新失败", nil) CodeDeleteErr = gcode.New(1006, "%s删除失败", nil) CodeAuthErr = gcode.New(1010, "登录失效或认证失败,请重新尝试", nil) CodePermErr = gcode.New(1011, "权限验证失败,请重新尝试", nil) CodeMicroCallErr = gcode.New(1100, "微服务调用失败,请重新尝试", nil) CodeConvErr = gcode.New(1200, "数据转换异常,请重新尝试", nil) CodeDbErr = gcode.New(1201, "数据库操作异常,请重新尝试", nil) CodeSysErr = gcode.New(500, "系统异常,请重新尝试", nil) ) // func New(errCode int, err error, errMsg ...string) error { // if err == nil { // return gerror.NewCode(errCode, handleErrMsg(ConvErr, errMsg...)) // } // return gerror.WrapCode(errCode, err, handleErrMsg(ConvErr, errMsg...)) // } func TipsError(errMsg string) error { return gerror.NewCode(CodeTipsErr, errMsg) } func ValidError(errMsg ...string) error { return gerror.NewCode(CodeValidErr, handleErrMsg(CodeValidErr, errMsg...)) } func QueryError(err error, module string) error { return gerror.WrapCodef(CodeQueryErr, err, CodeQueryErr.Message(), module) } func CreateError(err error, module string) error { return gerror.WrapCodef(CodeCreateErr, err, CodeCreateErr.Message(), module) } func UpdateError(err error, module string) error { return gerror.WrapCodef(CodeUpdateErr, err, CodeUpdateErr.Message(), module) } func DeleteError(err error, module string) error { return gerror.WrapCodef(CodeDeleteErr, err, CodeDeleteErr.Message(), module) } func AuthError(errMsg ...string) error { return gerror.NewCode(CodeAuthErr, handleErrMsg(CodeAuthErr, errMsg...)) } func PermError(errMsg ...string) error { return gerror.NewCode(CodePermErr, handleErrMsg(CodePermErr, errMsg...)) } func MicroCallError(errMsg ...string) error { return gerror.NewCode(CodeMicroCallErr, handleErrMsg(CodeMicroCallErr, errMsg...)) } func ConvError(errMsg ...string) error { return gerror.NewCode(CodeConvErr, handleErrMsg(CodeConvErr, errMsg...)) } func DbError(errMsg ...string) error { return gerror.NewCode(CodeDbErr, handleErrMsg(CodeDbErr, errMsg...)) } func SysError() error { return gerror.NewCode(CodeSysErr, CodeSysErr.Message()) } func handleErrMsg(errCode gcode.Code, errMsg ...string) string { msg := errCode.Message() if len(errMsg) > 0 { msg = errCode.Message() + ": " + strings.Join(errMsg, ", ") } return msg } type HandleErrorPlugin struct{} func (p HandleErrorPlugin) PreWriteResponse(ctx context.Context, req *protocol.Message, res *protocol.Message, err error) error { if err == nil { // todo 正常数据处理 resData := gconv.Map(res.Payload) resData["code"] = 200 if val, ok := resData["msg"]; !ok || val == "" { resData["msg"] = "操作成功" } res.Payload = gconv.Bytes(gconv.String(resData)) return nil } // error 堆栈信息输出 g.Log().Error(gerror.Stack(err)) topCode := gerror.Code(err).Code() if topCode > 0 { // 默认返回系统级异常处理 var resData = g.Map{ "code": CodeSysErr.Code(), "msg": CodeSysErr.Message(), } // 检查是否存在二级错误,如存在取底层错误信息 gNextError := gerror.Next(err) nextErrCode := topCode if gNextError != nil { nextErrCode = gerror.Code(gNextError).Code() } switch true { case nextErrCode > 1000: // 业务级异常处理 resData = g.Map{ "code": topCode, "msg": err, } case nextErrCode > 0 && topCode > 1000: // 检查是否存在业务信息,添加显示 resData = g.Map{ "code": topCode, "msg": splitErrorStr(err.Error()), } case nextErrCode == 51: // 检查是否存在业务信息,添加显示 resData = g.Map{ "code": CodeValidErr.Code(), "msg": CodeValidErr.Message() + ": " + err.Error(), } default: } res.Payload = gconv.Bytes(gconv.String(resData)) res.SetMessageStatusType(protocol.Normal) if res.Metadata != nil { delete(res.Metadata, protocol.ServiceError) } } return nil } func splitErrorStr(errMsg string) string { errStrIndex := strings.Index(errMsg, ": ") return errMsg[:errStrIndex] + ": " + CodeSysErr.Message() }