web-dev-qa-db-fra.com

Attraper `exception` dans l'API rapide globalement

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 :)

4
Ajeet Singh

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.

1
AndreFeijo

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}"})
0
Akihero3