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 // 错误消息 HTTPStatus int // HTTP 状态码(自动从 Code 映射,可通过 WithHTTPStatus 覆盖) 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 func New(code int, message string) *AppError { // 如果消息为空,使用默认消息 if message == "" { message = GetMessage(code, "zh-CN") } return &AppError{ Code: code, Message: message, HTTPStatus: GetHTTPStatus(code), // 自动从错误码映射 HTTP 状态码 } } // Wrap 用错误码和消息包装现有错误 func Wrap(code int, message string, err error) *AppError { // 如果消息为空,使用默认消息 if message == "" { message = GetMessage(code, "zh-CN") } return &AppError{ Code: code, Message: message, HTTPStatus: GetHTTPStatus(code), // 自动从错误码映射 HTTP 状态码 Err: err, } } // WithHTTPStatus 设置自定义 HTTP 状态码(用于特殊场景) func (e *AppError) WithHTTPStatus(status int) *AppError { e.HTTPStatus = status return e }