Spaces:
Running
Running
| """自定义异常 + FastAPI 异常处理.""" | |
| from __future__ import annotations | |
| from fastapi import FastAPI, Request | |
| from fastapi.responses import JSONResponse | |
| class AppError(Exception): | |
| """应用层业务异常的基类.""" | |
| code: str = "app_error" | |
| status_code: int = 500 | |
| retryable: bool = False | |
| def __init__( | |
| self, | |
| message: str, | |
| *, | |
| code: str | None = None, | |
| status_code: int | None = None, | |
| retryable: bool | None = None, | |
| detail: dict | None = None, | |
| ) -> None: | |
| super().__init__(message) | |
| self.message = message | |
| if code is not None: | |
| self.code = code | |
| if status_code is not None: | |
| self.status_code = status_code | |
| if retryable is not None: | |
| self.retryable = retryable | |
| self.detail = detail or {} | |
| class DocumentNotFoundError(AppError): | |
| code = "document_not_found" | |
| status_code = 404 | |
| class IngestionFailedError(AppError): | |
| code = "ingestion_failed" | |
| status_code = 500 | |
| retryable = True | |
| class LLMUnavailableError(AppError): | |
| code = "llm_unavailable" | |
| status_code = 503 | |
| retryable = True | |
| class VectorStoreUnavailableError(AppError): | |
| code = "vector_store_unavailable" | |
| status_code = 503 | |
| retryable = True | |
| def install_exception_handlers(app: FastAPI) -> None: | |
| """挂载全局异常处理. 由 main.py 在创建 app 后调用.""" | |
| async def _app_error_handler(_: Request, exc: AppError) -> JSONResponse: | |
| return JSONResponse( | |
| status_code=exc.status_code, | |
| content={ | |
| "code": exc.code, | |
| "message": exc.message, | |
| "retryable": exc.retryable, | |
| "detail": exc.detail, | |
| }, | |
| ) | |