Ausnahmen
Starlette ermöglicht es Ihnen, benutzerdefinierte Ausnahmehandler zu installieren, um zu behandeln, wie eine Antwort zurückgegeben wird, wenn ein Fehler aufgetreten ist oder eine behandelte Ausnahme vorliegt.
von starlette. applications import Starlette
from starlette. exceptions import HTTPException (Ausnahmen importieren)
from starlette. requests import Request (Eingabeaufforderung)
from starlette. responses import HTMLResponse (englisch)
HTML_404_PAGE = Seite
HTML_500_PAGE = Inhalt
async def nicht gefunden (request: Request, exc: HTTPException):
return HTMLResponse (Inhalt = HTML_404_PAGE, Status_code = exc. Status_code)
async def server_error (Anforderung: Request, exc: HTTPException):
return HTMLResponse (Inhalt = HTML_500_PAGE, Status_code = exc. Status_code)
exception_handlers ={Ausnahme_Handler}
404: Nicht gefunden
Fehler 500: Server Fehler
}
Starlette (routes = routes, exception_handlers = exception_handlers) ist eine
Wenn debug aktiviert ist und ein Fehler auftritt, verwendet Starlette eine Backtrack-Antwort anstelle eines installierten 500-Handlers.
Starlette (debug = true, routes = routes, exception_handlers = exception_handlers) ist ein Beispiel.
Neben der Registrierung von Handlern für bestimmte Statuscodes können Sie auch Handler für Ausnahmeklassen registrieren.
Insbesondere möchten Sie möglicherweise überschreiben, wie die integrierte HTTPException-Klasse behandelt wird, z. B. Antworten im JSON-Stil:
async def http_exception (Anforderung: Request, exc: HTTPException):
return JSONResponse ({"detail": exc.detail}, status_code = exc. status_code)({"detail": exc.detail}, status_code = exc. status_code) oder
exception_handlers ={Ausnahme_Handler]
HTTPException: HTTP-Ausnahmen
}
HTTPException verfügt auch über den headers-Parameter, mit dem der Header an die Response-Klasse weitergegeben werden kann:
async def http_exception (Anforderung: Request, exc: HTTPException):
Rückruf (
{"detail": exc.detail},
Beispiel: status_code = exc.
Headers = Exc. headers (englisch)
)
Vielleicht möchten Sie auch die Handhabung von WebSocketException überschreiben:
async def websocket_exception (websocket: WebSocket, exc: WebSocketException):
wait websocket. close (code = 1008)(auf Englisch)
exception_handlers ={Ausnahme_Handler]
WebSocketException: webSocket_Ausnahme
}
Fehler und behandelte Anomalien
Es ist wichtig, zwischen bearbeiteten Ausnahmen und Fehlern zu unterscheiden.
Verarbeitete Ausnahmen stellen keine Fehlersituation dar, in der sie in eine entsprechende HTTP-Antwort umgewandelt werden müssen, und werden dann über den Standard-Middleware-Stack gesendet, um verarbeitete Ausnahmen standardmäßig mit der HTTPException-Klasse zu verwalten.
Fehler sind alle anderen Ausnahmen, die innerhalb der Anwendung auftreten, diese Situationen sollten als Ausnahmen im gesamten Middleware-Stack sprudeln. Jede Fehlerprotokollierungs-Middleware sollte sicherstellen, dass die Ausnahmen während des gesamten Prozesses auf dem Server erneut ausgelöst werden.
In der Tat werden die verwendeten Fehler durch exception_handler[500] bzw. exception_handler[Exception] 。 500 und Exception Beide Schlüssel können wie folgt verwendet werden:
async def handle_error (Anfrage: Anfrage, Exc: HTTPException):
Perform eine Logik
JSONResponse ({"detail": exc.detail}, status_code = exc. status_code)({"detail": exc.detail}, status_code = exc. statuscode)({"detail": exc.detail}, status_code = exc. statuscode)({"detail": exc.detail}, status_code = exc. status_code) oder
exception_handlers ={Ausnahme_Handler}
Ausnahme: handle_error #oder 500: handle_error
}
Es sollte beachtet werden, wenn BackgroundTask Ungewöhnlich wird es sein, durch handle_error Die Funktion wird verarbeitet, aber zu diesem Zeitpunkt wurde die Antwort bereits gesendet. handle_error Die erstellte Antwort wird verworfen, wenn der Fehler auftritt, bevor die Antwort gesendet wird, wird das Antwortobjekt verwendet-im obigen Beispiel für die zurückgegebene Antwort. JSONResponse 。
Um dieses Verhalten richtig zu handhaben, ist der Middleware-Stack von Starlette Anwendungen so konfiguriert:
ServerErrorMiddleware- 500 Antworten werden zurückgegeben, wenn der Server einen Fehler verursacht.- Bereits installierte Middleware
ExceptionMiddleware- Behandelte Ausnahmen werden verarbeitet und eine Antwort wird zurückgegeben.- Der Router-Generator
- Endhaltestelle
HTTP ungewöhnlich
Die HTTPException-Klasse stellt eine Basisklasse bereit, die Sie für jede verarbeitete Ausnahme verwenden können Die Implementierung von ExceptionMiddleware gibt standardmäßig eine einfache HTTP-Antwort für jeden HTTPException zurück.
HTTPException(status_code, detail=None, headers=None)
Sie sollten HTTPException nur innerhalb der Route oder des Endpunkts auslösen, stattdessen sollte die Middleware-Klasse direkt die entsprechende Antwort zurückgeben.
WebSocket ist ungewöhnlich.
Sie können die WebSocketException-Klasse verwenden, um einen Fehler innerhalb eines WebSocket-Endpunkts auszugeben.
WebSocketException(code=1008, reason=None)
Sie können einen beliebigen gültigen Code festlegen, der in der Spezifikation definiert ist.