56 lines
1.7 KiB
Python
56 lines
1.7 KiB
Python
# 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"
|
|
}
|
|
}
|
|
)
|
|
|