| from fastapi import Request, Response |
| from fastapi.exceptions import HTTPException as FastAPIHTTPException |
| from fastapi.exceptions import RequestValidationError as FastAPIValidationError |
| from pydantic.error_wrappers import ValidationError as PydanticValidationError |
| from starlette.exceptions import HTTPException as StarletteHTTPException |
|
|
| from hibiapi.utils import exceptions |
| from hibiapi.utils.log import logger |
|
|
| from .application import app |
|
|
|
|
| @app.exception_handler(exceptions.BaseServerException) |
| async def exception_handler( |
| request: Request, |
| exc: exceptions.BaseServerException, |
| ) -> Response: |
| if isinstance(exc, exceptions.UncaughtException): |
| logger.opt(exception=exc).exception(f"Uncaught exception raised {exc.data=}:") |
|
|
| exc.data.url = str(request.url) |
| return Response( |
| content=exc.data.json(), |
| status_code=exc.data.code, |
| headers=exc.data.headers, |
| media_type="application/json", |
| ) |
|
|
|
|
| @app.exception_handler(StarletteHTTPException) |
| async def override_handler( |
| request: Request, |
| exc: StarletteHTTPException, |
| ): |
| return await exception_handler( |
| request, |
| exceptions.BaseHTTPException( |
| exc.detail, |
| code=exc.status_code, |
| headers={} if not isinstance(exc, FastAPIHTTPException) else exc.headers, |
| ), |
| ) |
|
|
|
|
| @app.exception_handler(AssertionError) |
| async def assertion_handler(request: Request, exc: AssertionError): |
| return await exception_handler( |
| request, |
| exceptions.ClientSideException(detail=f"Assertion: {exc}"), |
| ) |
|
|
|
|
| @app.exception_handler(FastAPIValidationError) |
| @app.exception_handler(PydanticValidationError) |
| async def validation_handler(request: Request, exc: PydanticValidationError): |
| return await exception_handler( |
| request, |
| exceptions.ValidationException(detail=str(exc), validation=exc.errors()), |
| ) |
|
|