finyx_data_ai/app/core/exceptions.py
2026-01-11 07:48:19 +08:00

95 lines
2.7 KiB
Python

"""
自定义异常类
"""
from typing import Optional, Any, Dict
from fastapi import HTTPException, status
class BaseAPIException(HTTPException):
"""基础 API 异常类"""
def __init__(
self,
status_code: int,
message: str,
error_code: Optional[str] = None,
error_detail: Optional[Any] = None,
headers: Optional[Dict[str, Any]] = None,
):
self.message = message
self.error_code = error_code or f"ERROR_{status_code}"
self.error_detail = error_detail
super().__init__(
status_code=status_code,
detail={
"error_code": self.error_code,
"message": self.message,
"error_detail": self.error_detail,
},
headers=headers,
)
class FileUploadException(BaseAPIException):
"""文件上传异常"""
def __init__(self, message: str, error_detail: Optional[Any] = None):
super().__init__(
status_code=status.HTTP_400_BAD_REQUEST,
message=message,
error_code="FILE_UPLOAD_ERROR",
error_detail=error_detail,
)
class FileParseException(BaseAPIException):
"""文件解析异常"""
def __init__(self, message: str, error_detail: Optional[Any] = None):
super().__init__(
status_code=status.HTTP_400_BAD_REQUEST,
message=message,
error_code="FILE_PARSE_ERROR",
error_detail=error_detail,
)
class LLMAPIException(BaseAPIException):
"""大模型 API 调用异常"""
def __init__(self, message: str, error_detail: Optional[Any] = None, retryable: bool = False):
super().__init__(
status_code=status.HTTP_500_INTERNAL_SERVER_ERROR,
message=message,
error_code="LLM_API_ERROR",
error_detail=error_detail,
)
self.retryable = retryable
class ValidationException(BaseAPIException):
"""数据验证异常"""
def __init__(self, message: str, error_detail: Optional[Any] = None):
super().__init__(
status_code=status.HTTP_422_UNPROCESSABLE_ENTITY,
message=message,
error_code="VALIDATION_ERROR",
error_detail=error_detail,
)
class NotFoundException(BaseAPIException):
"""资源不存在异常"""
def __init__(self, resource: str, identifier: Optional[str] = None):
message = f"{resource} not found"
if identifier:
message += f": {identifier}"
super().__init__(
status_code=status.HTTP_404_NOT_FOUND,
message=message,
error_code="NOT_FOUND",
error_detail={"resource": resource, "identifier": identifier},
)