Я пишу приложение, используя Fastapi. Части моего кода поднимают разные исключения, которые мне нужно обрабатывать. Я хочу, чтобы вся эта обработка была выполнена в одном месте (с разным, кроме блоков в зависимости от того, какое исключение было поднято). Я попытался сделать это, добавив следующее (упрощенное) промежуточное программное обеспечение в мое приложение Fastapi: < /p>
Код: Выделить всё
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 он никогда не достигнет блока, кроме в моем промежуточном программном обеспечении, потому что он уже будет обработан по умолчанию, чтобы добраться до поведения. Конкретные исключения, но это утомительно и не масштабируемо. Есть ли способ во всем мире принудительно обработку исключений, чтобы пройти через промежуточное программное обеспечение? (Бонусные баллы, если кто -то знает способ сделать это без использования декораторов, так как одно требование, которое я имею, не использовать их).
Подробнее здесь:
https://stackoverflow.com/questions/782 ... middleware