diff --git a/starlette/middleware/base.py b/starlette/middleware/base.py index 77ba66925..bf337b8e9 100644 --- a/starlette/middleware/base.py +++ b/starlette/middleware/base.py @@ -34,6 +34,10 @@ async def coro() -> None: try: message = await recv_stream.receive() except anyio.EndOfStream: + # HACK: give anyio a chance to surface any app exception first, + # in order to avoid an `anyio.ExceptionGroup`. + # See #1255. + await anyio.lowlevel.checkpoint() raise RuntimeError("No response returned.") assert message["type"] == "http.response.start" diff --git a/tests/middleware/test_base.py b/tests/middleware/test_base.py index 8a8df4ea6..c6bfd49fc 100644 --- a/tests/middleware/test_base.py +++ b/tests/middleware/test_base.py @@ -25,7 +25,7 @@ def homepage(request): @app.route("/exc") def exc(request): - raise Exception() + raise Exception("Exc") @app.route("/no-response") @@ -52,8 +52,9 @@ def test_custom_middleware(test_client_factory): response = client.get("/") assert response.headers["Custom-Header"] == "Example" - with pytest.raises(Exception): + with pytest.raises(Exception) as ctx: response = client.get("/exc") + assert str(ctx.value) == "Exc" with pytest.raises(RuntimeError): response = client.get("/no-response")