""" 自定义异常类 """ from typing import Any, Dict, Optional from fastapi import HTTPException, status class BusinessException(Exception): """业务逻辑异常基类""" def __init__( self, message: str, code: int = status.HTTP_400_BAD_REQUEST, error_code: Optional[str] = None, data: Optional[Dict[str, Any]] = None ): """ 初始化业务异常 Args: message: 错误消息 code: HTTP状态码 error_code: 业务错误码 data: 附加数据 """ self.message = message self.code = code self.error_code = error_code self.data = data super().__init__(self.message) class NotFoundException(BusinessException): """资源不存在异常""" def __init__(self, resource: str = "资源"): super().__init__( message=f"{resource}不存在", code=status.HTTP_404_NOT_FOUND, error_code="RESOURCE_NOT_FOUND" ) class AlreadyExistsException(BusinessException): """资源已存在异常""" def __init__(self, resource: str = "资源"): super().__init__( message=f"{resource}已存在", code=status.HTTP_409_CONFLICT, error_code="RESOURCE_ALREADY_EXISTS" ) class PermissionDeniedException(BusinessException): """权限不足异常""" def __init__(self, message: str = "权限不足"): super().__init__( message=message, code=status.HTTP_403_FORBIDDEN, error_code="PERMISSION_DENIED" ) class AuthenticationFailedException(BusinessException): """认证失败异常""" def __init__(self, message: str = "认证失败"): super().__init__( message=message, code=status.HTTP_401_UNAUTHORIZED, error_code="AUTHENTICATION_FAILED" ) class ValidationFailedException(BusinessException): """验证失败异常""" def __init__(self, message: str = "数据验证失败", errors: Optional[Dict] = None): super().__init__( message=message, code=status.HTTP_422_UNPROCESSABLE_ENTITY, error_code="VALIDATION_FAILED", data=errors ) class InvalidCredentialsException(AuthenticationFailedException): """无效凭据异常""" def __init__(self, message: str = "用户名或密码错误"): super().__init__(message) self.error_code = "INVALID_CREDENTIALS" class TokenExpiredException(AuthenticationFailedException): """令牌过期异常""" def __init__(self, message: str = "令牌已过期,请重新登录"): super().__init__(message) self.error_code = "TOKEN_EXPIRED" class InvalidTokenException(AuthenticationFailedException): """无效令牌异常""" def __init__(self, message: str = "无效的令牌"): super().__init__(message) self.error_code = "INVALID_TOKEN" class CaptchaException(BusinessException): """验证码异常""" def __init__(self, message: str = "验证码错误"): super().__init__( message=message, code=status.HTTP_400_BAD_REQUEST, error_code="CAPTCHA_ERROR" ) class UserLockedException(BusinessException): """用户被锁定异常""" def __init__(self, message: str = "用户已被锁定,请联系管理员"): super().__init__( message=message, code=status.HTTP_403_FORBIDDEN, error_code="USER_LOCKED" ) class UserDisabledException(BusinessException): """用户被禁用异常""" def __init__(self, message: str = "用户已被禁用"): super().__init__( message=message, code=status.HTTP_403_FORBIDDEN, error_code="USER_DISABLED" ) class StateTransitionException(BusinessException): """状态转换异常""" def __init__(self, current_state: str, target_state: str): super().__init__( message=f"无法从状态 '{current_state}' 转换到 '{target_state}'", code=status.HTTP_400_BAD_REQUEST, error_code="INVALID_STATE_TRANSITION" )