Coverage for extensions/exception_handler.py: 92.31%
26 statements
« prev ^ index » next coverage.py v7.9.2, created at 2026-01-25 13:05 +0000
« prev ^ index » next coverage.py v7.9.2, created at 2026-01-25 13:05 +0000
1from utils.response import APIResponse
2from fastapi.responses import JSONResponse
3from fastapi import FastAPI, Request, HTTPException
4from fastapi.exceptions import RequestValidationError
6def add_exception_handlers(app: FastAPI):
7 @app.exception_handler(HTTPException)
8 async def http_exception_handler(request: Request, exc: HTTPException):
9 status_code = exc.status_code
11 if isinstance(exc.detail, dict) and "code" in exc.detail and "message" in exc.detail:
12 return JSONResponse(
13 status_code=status_code,
14 content=exc.detail
15 )
17 message = exc.detail if exc.detail else "HTTP Error"
18 data = None
20 resp = APIResponse(code=status_code, message=message, data=data)
21 return JSONResponse(
22 status_code=status_code,
23 content=resp.dict(exclude_none=True)
24 )
26 @app.exception_handler(RequestValidationError)
27 async def validation_exception_handler(request: Request, exc: RequestValidationError):
28 errors = {}
29 for err in exc.errors():
30 field = ".".join([str(loc) for loc in err["loc"] if isinstance(loc, (str, int))])
31 errors[field] = err["msg"]
32 resp = APIResponse(code=422, message="Validation Error", data=errors)
33 return JSONResponse(
34 status_code=422,
35 content=resp.dict(exclude_none=True)
36 )
38 @app.exception_handler(Exception)
39 async def internal_server_error_handler(request: Request, exc: Exception):
40 resp = APIResponse(code=500, message="Internal Server Error", data=None)
41 return JSONResponse(
42 status_code=500,
43 content=resp.dict(exclude_none=True)
44 )