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
ExceptionMiddlewareBehandel 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.