70 lines
1.7 KiB
Python
70 lines
1.7 KiB
Python
# middleware/error_handler.py
|
|
"""Summary description ....
|
|
|
|
This module provides classes and functions for:
|
|
- ....
|
|
- ....
|
|
- ....
|
|
"""
|
|
|
|
import logging
|
|
|
|
from fastapi import HTTPException, Request
|
|
from fastapi.exceptions import RequestValidationError
|
|
from fastapi.responses import JSONResponse
|
|
|
|
logger = logging.getLogger(__name__)
|
|
|
|
|
|
async def custom_http_exception_handler(request: Request, exc: HTTPException):
|
|
"""Handle HTTP exception."""
|
|
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",
|
|
}
|
|
},
|
|
)
|