from fastapi import HTTPException, Request from fastapi.responses import JSONResponse from fastapi.exceptions import RequestValidationError from app.schemas.response import ErrorResponse class BusinessError(Exception): """业务错误异常,使用标准响应格式""" def __init__(self, message: str, code: int = 500): self.message = message self.code = code super().__init__(self.message) # 业务异常处理器 async def business_exception_handler(request: Request, exc: BusinessError): """将业务异常转换为标准响应格式""" return JSONResponse( status_code=200, # 返回200状态码,但在响应内容中设置业务错误码 content=ErrorResponse( code=exc.code, message=exc.message ).model_dump() ) # 请求验证错误处理器 async def validation_exception_handler(request: Request, exc: RequestValidationError): """将请求验证错误转换为标准错误响应""" error_messages = [] for error in exc.errors(): loc = error.get("loc", []) loc_str = " -> ".join(str(l) for l in loc) error_messages.append(f"{loc_str}: {error.get('msg')}") error_message = ", ".join(error_messages) return JSONResponse( status_code=422, # 保持422状态码,表示验证错误 content=ErrorResponse( code=422, message=f"请求参数验证错误: {error_message}" ).model_dump() ) def add_exception_handlers(app): """添加异常处理器到FastAPI应用""" app.add_exception_handler(BusinessError, business_exception_handler) app.add_exception_handler(RequestValidationError, validation_exception_handler)