Я хотел бы узнать, каков рекомендуемый способ обработки исключений в приложении FastAPI для конечных точек веб-сокетов.
Я пробовал:
app.add_exception_handler(Exception, handle_generic_exception)
Он перехватывает исключение, но не перехватывает, например. ValueError.
Я также пытался использовать @app.middleware("http"), но, похоже, он не работает с веб-сокетами.
from fastapi import FastAPI, Request, Response, WebSocket
app = FastAPI()
app.add_exception_handler(AppException, handle_disconnect)
@app.middleware("http")
async def generic_exception_middleware(request: Request | WebSocket, call_next):
try:
return await call_next(request)
except Exception as exc:
send_something_to_client()
print("some exception")
@app.websocket("/ws")
async def ws(websocket: WebSocket):
raise ValueError("foo")
Знает ли кто-нибудь из вас, как правильно обрабатывать общие исключения для конечных точек веб-сокетов?
РЕДАКТИРОВАТЬ 28 мая 2024 г.:
Я наконец добавил декоратор для обработки исключений для моих конечных точек веб-сокета. Но если есть более элегантное решение, дайте мне знать!
def handle_exceptions(func):
"""Decorator for handling exceptions."""
@functools.wraps(func)
async def wrapper(websocket: WebSocket):
try:
await func(websocket)
except WebSocketDisconnect as exc:
raise exc
except AppError as exc:
await app_error_handler(websocket, exc)
except Exception as exc: # pylint: disable=broad-exception-caught
await generic_exception_handler(websocket, exc)
return wrapper
[...]
@handle_exceptions
async def accept_api_v1(websocket: WebSocket):
"""Handle api v1 request."""
await websocket.accept()
do_things()
@app.websocket("/api/v1")
async def ws_api(websocket: WebSocket):
"""API v1 endpoint"""
await accept_api_v1(websocket)
Подробнее здесь: https://stackoverflow.com/questions/785 ... -endpoints