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

1from utils.response import APIResponse 

2from fastapi.responses import JSONResponse 

3from fastapi import FastAPI, Request, HTTPException 

4from fastapi.exceptions import RequestValidationError 

5 

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 

10 

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 ) 

16 

17 message = exc.detail if exc.detail else "HTTP Error" 

18 data = None 

19 

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 ) 

25 

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 ) 

37 

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 )