# middleware/error_handler.py from fastapi import Request, HTTPException from fastapi.responses import JSONResponse from fastapi.exceptions import RequestValidationError from starlette.exceptions import HTTPException as StarletteHTTPException import logging logger = logging.getLogger(__name__) async def custom_http_exception_handler(request: Request, exc: HTTPException): """Custom HTTP exception handler""" logger.error(f"HTTP {exc.status_code}: {exc.detail} - {request.method} {request.url}") return JSONResponse( status_code=exc.status_code, content={ "error": { "code": exc.status_code, "message": exc.detail, "type": "http_exception" } } ) async def validation_exception_handler(request: Request, exc: RequestValidationError): """Handle Pydantic validation errors""" logger.error(f"Validation error: {exc.errors()} - {request.method} {request.url}") return JSONResponse( status_code=422, content={ "error": { "code": 422, "message": "Validation error", "type": "validation_error", "details": exc.errors() } } ) async def general_exception_handler(request: Request, exc: Exception): """Handle unexpected exceptions""" logger.error(f"Unexpected error: {str(exc)} - {request.method} {request.url}", exc_info=True) return JSONResponse( status_code=500, content={ "error": { "code": 500, "message": "Internal server error", "type": "server_error" } } )