|
|
@@ -1,168 +1,142 @@
|
|
|
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"
|
|
|
)
|
|
|
|
|
|
-const (
|
|
|
-// SysErr = "系统异常,请重新尝试"
|
|
|
-// ConvErr = "数据转换异常,请重新尝试"
|
|
|
-// DbErr = "数据库操作异常,请重新尝试"
|
|
|
-// AuthErr = "认证异常,请重新尝试"
|
|
|
+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)
|
|
|
)
|
|
|
|
|
|
-type apiCode interface {
|
|
|
- Error() string
|
|
|
- Code() int
|
|
|
- TopError() error
|
|
|
+// 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)
|
|
|
}
|
|
|
-
|
|
|
-// 自定义异常,方便输出标准异常提示,同时在日志中能记录原始异常信息
|
|
|
-type Error struct {
|
|
|
- topError error // 原始异常
|
|
|
- error error
|
|
|
+func ValidError(errMsg ...string) error {
|
|
|
+ return gerror.NewCode(CodeValidErr, handleErrMsg(CodeValidErr, errMsg...))
|
|
|
}
|
|
|
-
|
|
|
-func (err *Error) Error() string {
|
|
|
- if err == nil {
|
|
|
- return ""
|
|
|
- }
|
|
|
- if err.error != nil {
|
|
|
- return err.error.Error()
|
|
|
- }
|
|
|
-
|
|
|
- return ""
|
|
|
+func QueryError(err error, module string) error {
|
|
|
+ return gerror.WrapCodef(CodeQueryErr, err, CodeQueryErr.Message(), module)
|
|
|
}
|
|
|
-
|
|
|
-// 返回原始异常信息
|
|
|
-func (err *Error) TopError() error {
|
|
|
- if err == nil {
|
|
|
- return nil
|
|
|
- }
|
|
|
-
|
|
|
- if err.topError != nil {
|
|
|
- return err.topError
|
|
|
- } else {
|
|
|
- return err.error
|
|
|
- }
|
|
|
+func CreateError(err error, module string) error {
|
|
|
+ return gerror.WrapCodef(CodeCreateErr, err, CodeCreateErr.Message(), module)
|
|
|
}
|
|
|
-
|
|
|
-func (err *Error) Code() int {
|
|
|
- if err == nil {
|
|
|
- return -1
|
|
|
- }
|
|
|
- return gerror.Code(err.error).Code()
|
|
|
+func UpdateError(err error, module string) error {
|
|
|
+ return gerror.WrapCodef(CodeUpdateErr, err, CodeUpdateErr.Message(), module)
|
|
|
}
|
|
|
-
|
|
|
-//func New(text string, topErr error) error {
|
|
|
-// return &Error{
|
|
|
-// topError: topErr,
|
|
|
-// error: gerror.New(text),
|
|
|
-// }
|
|
|
-//}
|
|
|
-
|
|
|
-func NewCode(code int, text string, topErr error) error {
|
|
|
- return &Error{
|
|
|
- topError: topErr,
|
|
|
- error: gerror.NewCode(nil, text),
|
|
|
- }
|
|
|
+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 Code(err error) int {
|
|
|
- if err != nil {
|
|
|
- if e, ok := err.(apiCode); ok {
|
|
|
- return e.Code()
|
|
|
- }
|
|
|
+func handleErrMsg(errCode gcode.Code, errMsg ...string) string {
|
|
|
+ msg := errCode.Message()
|
|
|
+ if len(errMsg) > 0 {
|
|
|
+ msg = errCode.Message() + ": " + strings.Join(errMsg, ", ")
|
|
|
}
|
|
|
- return -1
|
|
|
+ return msg
|
|
|
}
|
|
|
|
|
|
-// 输出原始异常
|
|
|
-func TopErr(err error) error {
|
|
|
- if err != nil {
|
|
|
- if e, ok := err.(apiCode); ok {
|
|
|
- return e.TopError()
|
|
|
+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
|
|
|
}
|
|
|
- return nil
|
|
|
-}
|
|
|
-
|
|
|
-// 异常检查 返回值:是否异常、error实例、异常码、异常信息
|
|
|
-func CheckError(err error, msg ...string) (bool, error, int32, string) {
|
|
|
- message := ""
|
|
|
- if err != nil {
|
|
|
- theErr := err
|
|
|
- if len(msg) > 0 {
|
|
|
- message = msg[0]
|
|
|
+ // 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(),
|
|
|
}
|
|
|
- if _, ok := err.(*gerror.Error); ok && message == "" {
|
|
|
- //message = SysErr
|
|
|
+ // 检查是否存在二级错误,如存在取底层错误信息
|
|
|
+ gNextError := gerror.Next(err)
|
|
|
+ nextErrCode := topCode
|
|
|
+ if gNextError != nil {
|
|
|
+ nextErrCode = gerror.Code(gNextError).Code()
|
|
|
}
|
|
|
- if Code(err) == 210 { // 提示性异常,不返回Error
|
|
|
- return false, nil, 210, err.Error()
|
|
|
- } else if Code(err) == 900 { // 系统级异常
|
|
|
- if TopErr(err) != nil {
|
|
|
- theErr = TopErr(err)
|
|
|
- }
|
|
|
- g.Log().Error(theErr) // 记录原始异常
|
|
|
- if message != "" {
|
|
|
- return true, gerror.New(message), 900, message
|
|
|
+ switch true {
|
|
|
+ case nextErrCode > 1000:
|
|
|
+ // 业务级异常处理
|
|
|
+ resData = g.Map{
|
|
|
+ "code": topCode,
|
|
|
+ "msg": err,
|
|
|
}
|
|
|
- return true, err, 900, err.Error()
|
|
|
- } else { // 常规异常
|
|
|
- if TopErr(err) != nil {
|
|
|
- theErr = TopErr(err)
|
|
|
+ case nextErrCode > 0 && topCode > 1000:
|
|
|
+ // 检查是否存在业务信息,添加显示
|
|
|
+ resData = g.Map{
|
|
|
+ "code": topCode,
|
|
|
+ "msg": splitErrorStr(err.Error()),
|
|
|
}
|
|
|
- g.Log().Error(theErr) // 记录原始异常
|
|
|
- if message != "" {
|
|
|
- return true, gerror.New(message), 500, message
|
|
|
+ case nextErrCode == 51:
|
|
|
+ // 检查是否存在业务信息,添加显示
|
|
|
+ resData = g.Map{
|
|
|
+ "code": CodeValidErr.Code(),
|
|
|
+ "msg": CodeValidErr.Message() + ": " + err.Error(),
|
|
|
}
|
|
|
- return true, err, 500, err.Error()
|
|
|
+ default:
|
|
|
+
|
|
|
+ }
|
|
|
+ res.Payload = gconv.Bytes(gconv.String(resData))
|
|
|
+ res.SetMessageStatusType(protocol.Normal)
|
|
|
+ if res.Metadata != nil {
|
|
|
+ delete(res.Metadata, protocol.ServiceError)
|
|
|
}
|
|
|
}
|
|
|
- return false, nil, 200, "操作成功"
|
|
|
-}
|
|
|
-
|
|
|
-// 提示性异常,不进行通常错误处理(不输出日志)
|
|
|
-func NewMsgError(topErr error, msg string) error {
|
|
|
- return NewCode(210, msg, topErr)
|
|
|
-}
|
|
|
|
|
|
-// 系统级别异常
|
|
|
-func NewSysError(topErr error, msg ...string) error {
|
|
|
- //message := SysErr
|
|
|
- //if len(msg) > 0 {
|
|
|
- // message = 1
|
|
|
- //}
|
|
|
- //return NewCode(900, message, topErr)
|
|
|
return nil
|
|
|
}
|
|
|
|
|
|
-// 数据库操作异常
|
|
|
-func NewDbError(topErr error, msg ...string) error {
|
|
|
- //message := DbErr
|
|
|
- //if len(msg) > 0 {
|
|
|
- // message = msg[0]
|
|
|
- //}
|
|
|
- return nil
|
|
|
-}
|
|
|
-
|
|
|
-// 类型转换异常
|
|
|
-func NewConvError(topErr error, msg ...string) error {
|
|
|
- //message := ConvErr
|
|
|
- //if len(msg) > 0 {
|
|
|
- // message = msg[0]
|
|
|
- //}
|
|
|
- return nil
|
|
|
-}
|
|
|
-
|
|
|
-// 认证异常
|
|
|
-func NewAuthError(topErr error, msg ...string) error {
|
|
|
- //message := AuthErr
|
|
|
- //if len(msg) > 0 {
|
|
|
- // message = msg[0]
|
|
|
- //}
|
|
|
- //return NewCode(401, message, topErr)
|
|
|
- return nil
|
|
|
+func splitErrorStr(errMsg string) string {
|
|
|
+ errStrIndex := strings.Index(errMsg, ": ")
|
|
|
+ return errMsg[:errStrIndex] + ": " + CodeSysErr.Message()
|
|
|
}
|