New submission from Tom <t...@collider.in>:
Consider this program: import asyncio async def handler(r, w): raise RuntimeError async def main(): server = await asyncio.start_server(handler, host='localhost', port=1234) r, w = await asyncio.open_connection(host='localhost', port=1234) await server.serve_forever() server.close() asyncio.run(main()) The RuntimeError is not retrievable via the serve_forever coroutine. To my knowledge, there is no feature of the asyncio API which causes the server to stop on an exception and retrieve it. I have also tried wrapping serve_forever in a Task, and waiting on the coro with FIRST_EXCEPTION. This severely complicates testing asyncio servers, since failing tests hang forever if the failure occurs in a callback. It should be possible to configure the server to end if a callback fails, e.g. by a 'stop_on_error' kwarg to start_server (defaulting to False for compatibility). I know this isn't a technical problem, since AnyIO, which uses asyncio, does this by default. This equivalent program ends after the exception: import anyio async def handler(client): raise RuntimeError async def main(): async with anyio.create_task_group() as tg: listener = await anyio.create_tcp_listener(local_host='localhost', local_port=1234) await tg.spawn(listener.serve, handler) async with await anyio.connect_tcp('localhost', 1234) as client: pass anyio.run(main) ---------- components: asyncio messages: 382265 nosy: asvetlov, tmewett, yselivanov priority: normal severity: normal status: open title: Exceptions in asyncio.Server callbacks are not retrievable versions: Python 3.7 _______________________________________ Python tracker <rep...@bugs.python.org> <https://bugs.python.org/issue42526> _______________________________________ _______________________________________________ Python-bugs-list mailing list Unsubscribe: https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com