package errors import ( "errors" "fmt" ) // 中间件标准错误类型 var ( ErrMissingToken = errors.New("missing authentication token") ErrInvalidToken = errors.New("invalid or expired token") ErrRedisUnavailable = errors.New("redis unavailable") ErrTooManyRequests = errors.New("too many requests") ) // AppError 表示带错误码的应用错误 type AppError struct { Code int // 应用错误码 Message string // 错误消息 Err error // 底层错误(可选) } func (e *AppError) Error() string { if e.Err != nil { return fmt.Sprintf("%s: %v", e.Message, e.Err) } return e.Message } func (e *AppError) Unwrap() error { return e.Err } // New 创建新的 AppError // 优先使用 errorMessages 映射表中的消息,允许通过可选参数覆盖 // 用法: // - errors.New(errors.CodeNotFound) // 使用映射表默认消息 // - errors.New(errors.CodeNotFound, "提现申请不存在") // 覆盖为自定义消息 func New(code int, customMsg ...string) *AppError { // 默认从映射表获取消息 message := GetMessage(code, "zh-CN") // 如果提供了自定义消息且非空,则覆盖 if len(customMsg) > 0 && customMsg[0] != "" { message = customMsg[0] } return &AppError{ Code: code, Message: message, } } // Wrap 用错误码和消息包装现有错误 // 优先使用 errorMessages 映射表中的消息,允许通过可选参数覆盖 // 用法: // - errors.Wrap(errors.CodeDatabaseError, originalErr) // 使用映射表默认消息 // - errors.Wrap(errors.CodeDatabaseError, originalErr, "查询用户失败") // 覆盖为自定义消息 func Wrap(code int, err error, customMsg ...string) *AppError { message := GetMessage(code, "zh-CN") if len(customMsg) > 0 && customMsg[0] != "" { message = customMsg[0] } return &AppError{ Code: code, Message: message, Err: err, } }