package myerrors import ( "github.com/gogf/gf/errors/gerror" "github.com/gogf/gf/frame/g" ) const ( SysErr = "系统异常,请重新尝试" ConvErr = "数据转换异常,请重新尝试" DbErr = "数据库操作异常,请重新尝试" AuthErr = "认证异常,请重新尝试" ) type apiCode interface { Error() string Code() int TopError() error } // 自定义异常,方便输出标准异常提示,同时在日志中能记录原始异常信息 type Error struct { topError error // 原始异常 error error } func (err *Error) Error() string { if err == nil { return "" } if err.error != nil { return err.error.Error() } return "" } // 返回原始异常信息 func (err *Error) TopError() error { if err == nil { return nil } if err.topError != nil { return err.topError } else { return err.error } } func (err *Error) Code() int { if err == nil { return -1 } return gerror.Code(err.error) } 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(code, text), } } func Code(err error) int { if err != nil { if e, ok := err.(apiCode); ok { return e.Code() } } return -1 } // 输出原始异常 func TopErr(err error) error { if err != nil { if e, ok := err.(apiCode); ok { return e.TopError() } } 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] } if _, ok := err.(*gerror.Error); ok && gerror.Code(err) == -1 && message == "" { message = SysErr } 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 } return true, err, 900, err.Error() } else { // 常规异常 if TopErr(err) != nil { theErr = TopErr(err) } g.Log().Error(theErr) // 记录原始异常 if message != "" { return true, gerror.New(message), 500, message } return true, err, 500, err.Error() } } 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 = msg[0] } return NewCode(900, message, topErr) } // 数据库操作异常 func NewDbError(topErr error, msg ...string) error { message := DbErr if len(msg) > 0 { message = msg[0] } return NewCode(500, message, topErr) } // 类型转换异常 func NewConvError(topErr error, msg ...string) error { message := ConvErr if len(msg) > 0 { message = msg[0] } return NewCode(500, message, topErr) } // 认证异常 func NewAuthError(topErr error, msg ...string) error { message := AuthErr if len(msg) > 0 { message = msg[0] } return NewCode(401, message, topErr) }