128 lines
3.6 KiB
Go
128 lines
3.6 KiB
Go
|
|
// Package errors 定义应用程序的错误类型
|
||
|
|
package errors
|
||
|
|
|
||
|
|
import (
|
||
|
|
"errors"
|
||
|
|
"fmt"
|
||
|
|
)
|
||
|
|
|
||
|
|
// 预定义错误
|
||
|
|
var (
|
||
|
|
// 用户相关错误
|
||
|
|
ErrUserNotFound = errors.New("用户不存在")
|
||
|
|
ErrUserAlreadyExists = errors.New("用户已存在")
|
||
|
|
ErrEmailAlreadyExists = errors.New("邮箱已被注册")
|
||
|
|
ErrInvalidPassword = errors.New("密码错误")
|
||
|
|
ErrAccountDisabled = errors.New("账号已被禁用")
|
||
|
|
|
||
|
|
// 认证相关错误
|
||
|
|
ErrUnauthorized = errors.New("未授权")
|
||
|
|
ErrInvalidToken = errors.New("无效的令牌")
|
||
|
|
ErrTokenExpired = errors.New("令牌已过期")
|
||
|
|
ErrInvalidSignature = errors.New("签名验证失败")
|
||
|
|
|
||
|
|
// 档案相关错误
|
||
|
|
ErrProfileNotFound = errors.New("档案不存在")
|
||
|
|
ErrProfileNameExists = errors.New("角色名已被使用")
|
||
|
|
ErrProfileLimitReached = errors.New("已达档案数量上限")
|
||
|
|
ErrProfileNoPermission = errors.New("无权操作此档案")
|
||
|
|
|
||
|
|
// 材质相关错误
|
||
|
|
ErrTextureNotFound = errors.New("材质不存在")
|
||
|
|
ErrTextureExists = errors.New("该材质已存在")
|
||
|
|
ErrTextureLimitReached = errors.New("已达材质数量上限")
|
||
|
|
ErrTextureNoPermission = errors.New("无权操作此材质")
|
||
|
|
ErrInvalidTextureType = errors.New("无效的材质类型")
|
||
|
|
|
||
|
|
// 验证码相关错误
|
||
|
|
ErrInvalidVerificationCode = errors.New("验证码错误或已过期")
|
||
|
|
ErrTooManyAttempts = errors.New("尝试次数过多")
|
||
|
|
ErrSendTooFrequent = errors.New("发送过于频繁")
|
||
|
|
|
||
|
|
// URL验证相关错误
|
||
|
|
ErrInvalidURL = errors.New("无效的URL格式")
|
||
|
|
ErrDomainNotAllowed = errors.New("URL域名不在允许的列表中")
|
||
|
|
|
||
|
|
// 存储相关错误
|
||
|
|
ErrStorageUnavailable = errors.New("存储服务不可用")
|
||
|
|
ErrUploadFailed = errors.New("上传失败")
|
||
|
|
|
||
|
|
// 通用错误
|
||
|
|
ErrBadRequest = errors.New("请求参数错误")
|
||
|
|
ErrInternalServer = errors.New("服务器内部错误")
|
||
|
|
ErrNotFound = errors.New("资源不存在")
|
||
|
|
ErrForbidden = errors.New("权限不足")
|
||
|
|
)
|
||
|
|
|
||
|
|
// AppError 应用错误类型,包含错误码和消息
|
||
|
|
type AppError struct {
|
||
|
|
Code int // HTTP状态码
|
||
|
|
Message string // 用户可见的错误消息
|
||
|
|
Err error // 原始错误(用于日志)
|
||
|
|
}
|
||
|
|
|
||
|
|
// Error 实现error接口
|
||
|
|
func (e *AppError) Error() string {
|
||
|
|
if e.Err != nil {
|
||
|
|
return fmt.Sprintf("%s: %v", e.Message, e.Err)
|
||
|
|
}
|
||
|
|
return e.Message
|
||
|
|
}
|
||
|
|
|
||
|
|
// Unwrap 支持errors.Is和errors.As
|
||
|
|
func (e *AppError) Unwrap() error {
|
||
|
|
return e.Err
|
||
|
|
}
|
||
|
|
|
||
|
|
// NewAppError 创建新的应用错误
|
||
|
|
func NewAppError(code int, message string, err error) *AppError {
|
||
|
|
return &AppError{
|
||
|
|
Code: code,
|
||
|
|
Message: message,
|
||
|
|
Err: err,
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
// NewBadRequest 创建400错误
|
||
|
|
func NewBadRequest(message string, err error) *AppError {
|
||
|
|
return NewAppError(400, message, err)
|
||
|
|
}
|
||
|
|
|
||
|
|
// NewUnauthorized 创建401错误
|
||
|
|
func NewUnauthorized(message string) *AppError {
|
||
|
|
return NewAppError(401, message, nil)
|
||
|
|
}
|
||
|
|
|
||
|
|
// NewForbidden 创建403错误
|
||
|
|
func NewForbidden(message string) *AppError {
|
||
|
|
return NewAppError(403, message, nil)
|
||
|
|
}
|
||
|
|
|
||
|
|
// NewNotFound 创建404错误
|
||
|
|
func NewNotFound(message string) *AppError {
|
||
|
|
return NewAppError(404, message, nil)
|
||
|
|
}
|
||
|
|
|
||
|
|
// NewInternalError 创建500错误
|
||
|
|
func NewInternalError(message string, err error) *AppError {
|
||
|
|
return NewAppError(500, message, err)
|
||
|
|
}
|
||
|
|
|
||
|
|
// Is 检查错误是否匹配
|
||
|
|
func Is(err, target error) bool {
|
||
|
|
return errors.Is(err, target)
|
||
|
|
}
|
||
|
|
|
||
|
|
// As 尝试将错误转换为指定类型
|
||
|
|
func As(err error, target interface{}) bool {
|
||
|
|
return errors.As(err, target)
|
||
|
|
}
|
||
|
|
|
||
|
|
// Wrap 包装错误
|
||
|
|
func Wrap(err error, message string) error {
|
||
|
|
if err == nil {
|
||
|
|
return nil
|
||
|
|
}
|
||
|
|
return fmt.Errorf("%s: %w", message, err)
|
||
|
|
}
|