From 783841d37ef9874695a2ccd1035e573b63dd1e09 Mon Sep 17 00:00:00 2001 From: MrWaradana Date: Thu, 12 Feb 2026 15:14:18 +0700 Subject: [PATCH] add validation errors --- src/exceptions.py | 25 ++++++++++++++++++++++++- src/main.py | 5 +++++ 2 files changed, 29 insertions(+), 1 deletion(-) diff --git a/src/exceptions.py b/src/exceptions.py index 8c9b589..bab7e8d 100644 --- a/src/exceptions.py +++ b/src/exceptions.py @@ -99,7 +99,30 @@ def handle_exception(request: Request, exc: Exception): request_info = get_request_context(request) if isinstance(exc, RateLimitExceeded): - _rate_limit_exceeded_handler(request, exc) + return _rate_limit_exceeded_handler(request, exc) + + if isinstance(exc, RequestValidationError): + logging.error( + f"Validation error | Error: {str(exc.errors())} | Request: {request_info}", + extra={"error_category": "validation"}, + ) + return JSONResponse( + status_code=422, + content={ + "data": None, + "message": "Validation error", + "status": ResponseStatus.ERROR, + "errors": [ + ErrorDetail( + field=".".join(map(str, err["loc"])), + message=err["msg"], + code=err["type"], + ).model_dump() + for err in exc.errors() + ] + } + ) + if isinstance(exc, HTTPException): logging.error( f"HTTP exception | Code: {exc.status_code} | Error: {exc.detail} | Request: {request_info}", diff --git a/src/main.py b/src/main.py index 8f8f8c1..9f604b0 100644 --- a/src/main.py +++ b/src/main.py @@ -7,12 +7,14 @@ from typing import Optional, Final from fastapi import FastAPI, HTTPException, status +from fastapi.exceptions import RequestValidationError from fastapi.responses import JSONResponse from pydantic import ValidationError from slowapi import _rate_limit_exceeded_handler from slowapi.errors import RateLimitExceeded from sqlalchemy import inspect +from sqlalchemy.exc import SQLAlchemyError from sqlalchemy.orm import scoped_session from sqlalchemy.ext.asyncio import async_scoped_session from starlette.middleware.base import BaseHTTPMiddleware, RequestResponseEndpoint @@ -47,6 +49,9 @@ app = FastAPI(exception_handlers=exception_handlers, openapi_url="", title="LCCA version="0.1.0") app.state.limiter = limiter app.add_exception_handler(RateLimitExceeded, _rate_limit_exceeded_handler) +app.add_exception_handler(HTTPException, handle_exception) +app.add_exception_handler(RequestValidationError, handle_exception) +app.add_exception_handler(SQLAlchemyError, handle_exception) app.add_middleware(GZipMiddleware, minimum_size=2000)