Files
ProxyPool/app/api/errors.py

44 lines
1.4 KiB
Python

"""统一异常处理"""
from fastapi import Request
from fastapi.responses import JSONResponse
from starlette.exceptions import HTTPException as StarletteHTTPException
from pydantic import ValidationError
from app.core.exceptions import ProxyPoolException
from app.core.log import logger
async def proxy_pool_exception_handler(request: Request, exc: ProxyPoolException):
return JSONResponse(
status_code=exc.code,
content={"code": exc.code, "message": exc.message, "data": None},
)
async def http_exception_handler(request: Request, exc: StarletteHTTPException):
return JSONResponse(
status_code=exc.status_code,
content={"code": exc.status_code, "message": exc.detail, "data": None},
)
async def pydantic_validation_handler(request: Request, exc: ValidationError):
logger.error(f"Validation error: {exc}")
errors = exc.errors()
message = errors[0].get("msg", "参数验证失败") if errors else "参数验证失败"
return JSONResponse(
status_code=422,
content={
"code": 422,
"message": message,
"data": errors,
},
)
async def general_exception_handler(request: Request, exc: Exception):
logger.error(f"Unhandled exception: {exc}", exc_info=True)
return JSONResponse(
status_code=500,
content={"code": 500, "message": "服务器内部错误", "data": None},
)