self.assertEqual(messages, [])
- def test_unhandled_exceptions(self) -> None:
+ def _basetest_unhandled_exceptions(self, handle_echo):
port = socket_helper.find_unused_port()
messages = []
await wr.wait_closed()
async def main():
- async def handle_echo(reader, writer):
- raise Exception('test')
-
server = await asyncio.start_server(
handle_echo, 'localhost', port)
await server.start_serving()
await server.wait_closed()
self.loop.run_until_complete(main())
+ return messages
+ def test_unhandled_exception(self):
+ async def handle_echo(reader, writer):
+ raise Exception('test')
+ messages = self._basetest_unhandled_exceptions(handle_echo)
self.assertEqual(messages[0]['message'],
- 'Unhandled exception in client_connected_cb')
- # Break explicitly reference cycle
- messages = None
+ 'Unhandled exception in client_connected_cb')
+
+ def test_unhandled_cancel(self):
+ async def handle_echo(reader, writer):
+ asyncio.current_task().cancel()
+ messages = self._basetest_unhandled_exceptions(handle_echo)
+ self.assertEqual(messages, [])
if __name__ == '__main__':
--- /dev/null
+In :meth:`asyncio.StreamReaderProtocol.connection_made`, there is callback
+that logs an error if the task wrapping the "connected callback" fails. This
+callback would itself fail if the task was cancelled. Prevent this by
+checking whether the task was cancelled first. If so, close the transport
+but don't log an error.