Код: Выделить всё
from fastapi import APIRouter, FastAPI, Request, HTTPException, Response, status
from starlette.middleware.base import BaseHTTPMiddleware
from fastapi.responses import JSONResponse
class ExceptionHandlerMiddleware(BaseHTTPMiddleware):
async def dispatch(self, request: Request, call_next):
try:
return await call_next(request)
except HTTPException as e:
return JSONResponse(status_code=e.status_code, content={'message': e.detail})
except Exception as e:
return JSONResponse(status_code=status.HTTP_500_INTERNAL_SERVER_ERROR, content={'message': str(e)})
# app creation and config go here....
app.add_middleware(ExceptionHandlerMiddleware)
Документация Fastapi дает возможность переопределить поведение по умолчанию для определенных исключений, но это утомительно и не масштабируемо. Есть ли способ глобально заставить всю обработку исключений проходить через мое промежуточное программное обеспечение? (бонусные баллы, если кто-нибудь знает способ сделать это без использования декораторов, поскольку у меня есть одно требование — не использовать их)
ОБНОВЛЕНИЕ: Изначально мой вопрос был закрыт как дубликат этого вопроса, однако это НЕ одно и то же. Этот вопрос касается перехвата необработанных исключений, и в моем вопросе я имею дело с принуждением обработки исключений, которые обрабатываются по умолчанию (например, HTTPException), в другом месте кода, который я контролирую (как указано в моем вопросе, пытаясь перехватить HTTPException в промежуточном программном обеспечении не работает! (это и есть вывод из связанного вопроса))
Подробнее здесь: https://stackoverflow.com/questions/782 ... middleware