Ga naar inhoud

Uitzonderingen

Met Starlette kunt u aangepaste uitzonderingshandlers installeren om af te handelen hoe u een antwoord kunt retourneren wanneer er een fout of afgehandelde uitzondering optreedt.

Starlette.applicaties importeren vanuit Starlette
Van starlette.exceptions HTTPException importeren
Van starlette. aanvragen import aanvragen
Uit starlette.reacties importeren HTMLResponse


HTML _ 404 _ PAGINA =...
HTML _ 500 _ PAGINA =...


Async def niet _ gevonden (verzoek: verzoek, exc: HTTPException):
    Geef HTMLResponse terug (inhoud = HTML _ 404 _ PAGE, status _ code = exc. status _ code)

Async def server _ error (verzoek: verzoek, exc: HTTPException):
    Geef HTMLResponse terug (inhoud = HTML _ 500 _ PAGE, status _ code = exc. status _ code)


uitzondering _ handlers = {
    404: niet _ gevonden,
    500: server _ fout
}

App = Starlette (routes = routes, uitzondering _ handlers = uitzondering _ handlers)

Als debug is ingeschakeld en er een fout optreedt, gebruikt Starlette een backtracking-reactie in plaats van de 500-handler die is geïnstalleerd.

App = Starlette (debug = Waar, routes = routes, uitzondering _ handlers = uitzondering _ handlers)

Naast het registreren van handlers voor specifieke statuscodes, kunt u ook handlers registreren voor uitzonderingsklassen.

In het bijzonder kunt u de afhandeling van de ingebouwde HTTPException-klasse overschrijven. Bijvoorbeeld met een JSON-achtige reactie:

Async def http _ exception (verzoek: verzoek, exc: HTTPException):
    Geef JSONResponse terug ({"detail": exc.detail}, status _ code = exc. status _ code)

uitzondering _ handlers = {
    HTTPException: http _ uitzondering
}

HTTPException is ook uitgerust met de headers-parameter. Hiermee kan de header worden gepropageerd naar de responsklasse:

Async def http _ exception (verzoek: verzoek, exc: HTTPException):
    Geeft JSONResponse (
        {"detail": exc.detail},
        status _ code = excl. status _ code,
        Kopteksten = exc.headers
    )

Mogelijk wilt u ook de behandeling van WebSocketException overschrijven:

Async def websocket _ suitzondering (websocket: WebSocket, exc: WebSocketException):
    Wacht op websocket.close (code = 1008)

uitzondering _ handlers = {
    WebSocketException: websocket _ uitzondering
}

Fouten en afgehandelde uitzonderingen

Het is belangrijk om onderscheid te maken tussen afgehandelde uitzonderingen en fouten.

Afgehandelde uitzonderingen vertegenwoordigen geen foutconditie. Ze worden gedwongen tot een passend HTTP-antwoord en vervolgens verzonden via de standaard middleware-stack. Standaard wordt de HTTPException-klasse gebruikt om afgehandelde uitzonderingen te beheren.

Fouten zijn alle andere uitzonderingen die zich voordoen binnen de applicatie. Deze voorwaarden zouden moeten opborrelen als uitzonderingen in de middleware-stack. Elke fout bij het loggen van middleware moet ervoor zorgen dat de uitzondering opnieuw wordt verhoogd tot aan de server.

In feite is de gebruikte foutafhandeling exception_handler[500] of exception_handler[Exception]. Zowel de 500- als Exception-toetsen kunnen worden gebruikt. Zie hieronder:

Async def handle _ error (verzoek: verzoek, exc: HTTPException):
    Voer wat logica uit
    Geef JSONResponse terug ({"detail": exc.detail}, status _ code = exc. status _ code)

uitzondering _ handlers = {
    Uitzondering: handle _ error # of "500: handle _ error"
}

Het is belangrijk op te merken dat als BackgroundTask een uitzondering gooit, deze wordt afgehandeld door de handle_error-functie, maar het antwoord is al verzonden. Met andere woorden, het antwoord dat door handle_error is gemaakt, wordt weggegooid. Als de fout optreedt voordat het antwoord wordt verzonden, wordt het antwoordobject gebruikt - in het bovenstaande voorbeeld de geretourneerde JSONResponse.

Om dit gedrag correct af te handelen, is de middlewarestack van een Starlette-applicatie als volgt geconfigureerd:

  • ServerErrorMiddleware - 500 reacties worden geretourneerd wanneer er een fout optreedt op de server.
  • middleware geïnstalleerd
  • ExceptionMiddleware Behandel afgehandelde uitzonderingen en retourneer een antwoord.
  • Router
  • eindpunt

HTTP uitzondering

De klasse HTTPException biedt een basisklasse die u kunt gebruiken voor afgehandelde uitzonderingen. De implementatie van ExceptionMiddleware retourneert standaard een HTTP-antwoord in platte tekst voor elke HTTPException.

  • HTTPException(status_code, detail=None, headers=None)

U moet HTTPException alleen binnen een route of eindpunt verhogen. In plaats daarvan zouden middleware-klassen het juiste antwoord direct moeten retourneren.

WebSocket uitzondering

U kunt de klasse WebSocketException gebruiken om een fout op te roepen binnen een WebSocket-eindpunt.

  • WebSocketException(code=1008, reason=None)

U kunt elke geldige code instellen zoals gedefinieerd in de specificatie.