feat: 初始化考培练系统项目
- 从服务器拉取完整代码 - 按框架规范整理项目结构 - 配置 Drone CI 测试环境部署 - 包含后端(FastAPI)、前端(Vue3)、管理端 技术栈: Vue3 + TypeScript + FastAPI + MySQL
This commit is contained in:
89
backend/app/core/exceptions.py
Normal file
89
backend/app/core/exceptions.py
Normal file
@@ -0,0 +1,89 @@
|
||||
"""统一异常定义"""
|
||||
from typing import Optional, Dict, Any
|
||||
from fastapi import HTTPException, status
|
||||
|
||||
|
||||
class BusinessError(HTTPException):
|
||||
"""业务异常基类"""
|
||||
|
||||
def __init__(
|
||||
self,
|
||||
message: str,
|
||||
code: int = status.HTTP_400_BAD_REQUEST,
|
||||
error_code: Optional[str] = None,
|
||||
detail: Optional[Dict[str, Any]] = None,
|
||||
):
|
||||
super().__init__(
|
||||
status_code=code,
|
||||
detail={
|
||||
"message": message,
|
||||
"error_code": error_code or f"ERR_{code}",
|
||||
"detail": detail,
|
||||
},
|
||||
)
|
||||
self.message = message
|
||||
self.code = code
|
||||
self.error_code = error_code
|
||||
|
||||
|
||||
class BadRequestError(BusinessError):
|
||||
"""400 错误请求"""
|
||||
|
||||
def __init__(self, message: str = "错误的请求", **kwargs):
|
||||
super().__init__(message, status.HTTP_400_BAD_REQUEST, **kwargs)
|
||||
|
||||
|
||||
class UnauthorizedError(BusinessError):
|
||||
"""401 未授权"""
|
||||
|
||||
def __init__(self, message: str = "未授权", **kwargs):
|
||||
super().__init__(message, status.HTTP_401_UNAUTHORIZED, **kwargs)
|
||||
|
||||
|
||||
class ForbiddenError(BusinessError):
|
||||
"""403 禁止访问"""
|
||||
|
||||
def __init__(self, message: str = "禁止访问", **kwargs):
|
||||
super().__init__(message, status.HTTP_403_FORBIDDEN, **kwargs)
|
||||
|
||||
|
||||
class NotFoundError(BusinessError):
|
||||
"""404 未找到"""
|
||||
|
||||
def __init__(self, message: str = "资源未找到", **kwargs):
|
||||
super().__init__(message, status.HTTP_404_NOT_FOUND, **kwargs)
|
||||
|
||||
|
||||
class ConflictError(BusinessError):
|
||||
"""409 冲突"""
|
||||
|
||||
def __init__(self, message: str = "资源冲突", **kwargs):
|
||||
super().__init__(message, status.HTTP_409_CONFLICT, **kwargs)
|
||||
|
||||
|
||||
class ValidationError(BusinessError):
|
||||
"""422 验证错误"""
|
||||
|
||||
def __init__(self, message: str = "验证失败", **kwargs):
|
||||
super().__init__(message, status.HTTP_422_UNPROCESSABLE_ENTITY, **kwargs)
|
||||
|
||||
|
||||
class InternalServerError(BusinessError):
|
||||
"""500 内部服务器错误"""
|
||||
|
||||
def __init__(self, message: str = "内部服务器错误", **kwargs):
|
||||
super().__init__(message, status.HTTP_500_INTERNAL_SERVER_ERROR, **kwargs)
|
||||
|
||||
|
||||
class InsufficientPermissionsError(ForbiddenError):
|
||||
"""权限不足"""
|
||||
|
||||
def __init__(self, message: str = "权限不足", **kwargs):
|
||||
super().__init__(message, error_code="INSUFFICIENT_PERMISSIONS", **kwargs)
|
||||
|
||||
|
||||
class ExternalServiceError(BusinessError):
|
||||
"""外部服务错误"""
|
||||
|
||||
def __init__(self, message: str = "外部服务异常", **kwargs):
|
||||
super().__init__(message, status.HTTP_502_BAD_GATEWAY, error_code="EXTERNAL_SERVICE_ERROR", **kwargs)
|
||||
Reference in New Issue
Block a user