Gestion des erreurs (Fast API)

Dans FastAPI, la gestion des erreurs consiste à intercepter et traiter les exceptions afin de renvoyer au client une réponse claire, structurée et conforme au format attendu (souvent JSON).
Cela permet d’éviter des messages d’erreur techniques non maîtrisés et d’améliorer l’expérience utilisateur ou développeur.

FastAPI repose sur Starlette, qui offre un système puissant de gestion des erreurs et des exceptions personnalisées.


Comment ça fonctionne dans FastAPI

Déclencher une erreur

Définir un gestionnaire d’erreurs personnalisé

Codes HTTP courants


Exemple conceptuel


Bonnes pratiques


Pourquoi c’est important


En résumé

Fonctions :

  • Gestion des erreurs avec Fast API (exemple)

    Exemple de code :

    from fastapi import FastAPI, HTTPException, Request
    from fastapi.responses import JSONResponse
    
    app = FastAPI()
    
    # 1️⃣ Route normale
    @app.get("/items/{item_id}")
    def read_item(item_id: int):
        # Simuler une erreur si l'ID est négatif
        if item_id < 0:
            raise HTTPException(status_code=400, detail="ID invalide : doit être positif")
        return {"item_id": item_id, "name": f"Item {item_id}"}
    
    # 2️⃣ Gestion globale des erreurs personnalisées
    @app.exception_handler(Exception)
    async def generic_exception_handler(request: Request, exc: Exception):
        return JSONResponse(
            status_code=500,
            content={"message": f"Une erreur est survenue : {str(exc)}"}
        )

    Explication du code :

    from fastapi import FastAPI, HTTPException, Request importe FastAPI pour créer l’application, HTTPException pour lever des erreurs HTTP spécifiques et Request pour accéder aux informations sur la requête dans les gestionnaires d’erreurs.

    from fastapi.responses import JSONResponse importe JSONResponse pour renvoyer des réponses JSON personnalisées lors d’erreurs.

    Créer l’application FastAPI

    app = FastAPI() crée une instance de l’application qui servira à définir les routes et gérer les requêtes.

    Route normale avec gestion d’erreur spécifique

    @app.get("/items/{item_id}") définit une route GET qui prend un paramètre dynamique item_id.
    def read_item(item_id: int): la fonction reçoit cet ID en tant qu’entier.

    if item_id < 0: vérifie si l’ID est négatif.
    raise HTTPException(status_code=400, detail="ID invalide : doit être positif") lève une exception HTTP 400 avec un message explicite si l’ID est invalide.

    return {"item_id": item_id, "name": f"Item {item_id}"} renvoie les informations de l’item si tout est correct.

    Gestion globale des erreurs inattendues

    @app.exception_handler(Exception) définit un gestionnaire pour toutes les exceptions de type Exception non gérées par les routes.
    async def generic_exception_handler(request: Request, exc: Exception): la fonction reçoit la requête et l’exception.

    return JSONResponse(...) renvoie une réponse JSON avec :
    - status_code=500 pour indiquer une erreur serveur.
    - content={"message": f"Une erreur est survenue : {str(exc)}"} pour fournir un message clair avec le texte de l’erreur.