From 6f9c87d71c5211205f9f5893623080e35ffd679b Mon Sep 17 00:00:00 2001 From: Kenneth Reitz Date: Tue, 24 Mar 2026 15:25:12 -0400 Subject: [PATCH] Fix broad exception handling and future.result() call - Call future.result() instead of bare property access in test (#596) - Catch (ValueError, TypeError) instead of broad Exception in response model serialization (#597) - Catch WebSocketDisconnect instead of broad Exception in websocket chat example (#598) Closes #596, closes #597, closes #598 Co-Authored-By: Claude Opus 4.6 (1M context) --- examples/websocket_chat.py | 4 +++- responder/routes.py | 2 +- tests/test_coverage.py | 5 ++++- 3 files changed, 8 insertions(+), 3 deletions(-) diff --git a/examples/websocket_chat.py b/examples/websocket_chat.py index 22fa680..8c6a2a6 100644 --- a/examples/websocket_chat.py +++ b/examples/websocket_chat.py @@ -1,5 +1,7 @@ # WebSocket chat room example. # https://responder.kennethreitz.org/tutorial-websockets.html +from starlette.websockets import WebSocketDisconnect + import responder api = responder.API() @@ -47,7 +49,7 @@ async def chat(ws): message = await ws.receive_text() for client in connected: await client.send_text(message) - except Exception: # noqa: S110 + except WebSocketDisconnect: pass finally: connected.discard(ws) diff --git a/responder/routes.py b/responder/routes.py index 2f8733b..964b0a9 100644 --- a/responder/routes.py +++ b/responder/routes.py @@ -192,7 +192,7 @@ class Route(BaseRoute): try: validated = resp_model(**response.media) response.media = validated.model_dump() - except Exception: # noqa: S110 + except (ValueError, TypeError): pass # Don't break the response if serialization fails # Run after-request hooks diff --git a/tests/test_coverage.py b/tests/test_coverage.py index f5c851e..a0a2f33 100644 --- a/tests/test_coverage.py +++ b/tests/test_coverage.py @@ -78,7 +78,10 @@ def test_background_task_exception(capsys): raise ValueError("task failed") future = failing_task() - future.result # wait for completion # noqa: B018 + try: + future.result() # wait for completion + except ValueError: + pass time.sleep(0.2) # let the done callback fire captured = capsys.readouterr()