Je suis très nouveau python et Fastapi. J'essaie d'attraper des exceptions non gérées au niveau mondial. Donc, quelque part dans main.py
Dossier J'écris ci-dessous:
@app.exception_handler(Exception)
async def exception_callback(request: Request, exc: Exception):
logger.error(exc.detail)
Mais au-dessus de la méthode n'est jamais exécutée. Mais si j'écris une exception personnalisée et essayez de l'attraper (comme ci-dessous), cela fonctionne bien.
class MyException(Exception):
#some code
@app.exception_handler(MyException)
async def exception_callback(request: Request, exc: MyException):
logger.error(exc.detail)
J'ai traversé - Type d'exception de capture d'exception et demande du corps de processus n ° 575 . Mais ce bogue parle d'accéder au corps de la demande. Après avoir vu ce bogue, je pense que cela devrait être possible d'attraper Exception
. Version Fastapi fastapi>=0.52.0
.
Merci d'avance :)
Si vous souhaitez capturer toutes les exceptions non conçues (erreur de serveur interne), il y a un moyen très simple de le faire
from fastapi import FastAPI
from starlette.requests import Request
from starlette.responses import Response
app = FastAPI()
async def catch_exceptions_middleware(request: Request, call_next):
try:
return await call_next(request)
except Exception:
# you probably want some kind of logging here
return Response("Internal server error", status_code=500)
app.middleware('http')(catch_exceptions_middleware)
Assurez-vous de placer ce middleware avant tout.
Vous pouvez faire quelque chose comme ça. Il devrait renvoyer un objet JSON avec votre message d'erreur personnalisé fonctionne également dans le mode de débogueur.
from fastapi import FastAPI
from fastapi.responses import JSONResponse
app = FastAPI()
@app.exception_handler(Exception)
async def validation_exception_handler(request, err):
base_error_message = f"Failed to execute: {request.method}: {request.url}"
# Change here to LOGGER
return JSONResponse(status_code=400, content={"message": f"{base_error_message}. Detail: {err}"})