New submission from Michel Desmoulin: If you trigger KeyboardInterrupt in a coroutine and catch it, the program terminates cleanly:
import asyncio async def bar(): raise KeyboardInterrupt loop = asyncio.get_event_loop() try: loop.run_until_complete(bar()) except KeyboardInterrupt: print("It's ok") finally: loop.stop() loop.close() This outputs: It's ok However, if you wrap the coroutine in a Task, you will get a mixed behavior: try: task = asyncio.ensure_future(bar()) loop.run_until_complete(task) except KeyboardInterrupt: print("It's ok") This outputs: It's ok Task exception was never retrieved future: <Task finished coro=<bar() done, defined at ki_bug.py:4> exception=KeyboardInterrupt()> Traceback (most recent call last): File "ki_bug.py", line 10, in <module> loop.run_until_complete(main_future) File "/usr/lib/python3.5/asyncio/base_events.py", line 325, in run_until_complete self.run_forever() File "/usr/lib/python3.5/asyncio/base_events.py", line 295, in run_forever self._run_once() File "/usr/lib/python3.5/asyncio/base_events.py", line 1258, in _run_once handle._run() File "/usr/lib/python3.5/asyncio/events.py", line 125, in _run self._callback(*self._args) File "/usr/lib/python3.5/asyncio/tasks.py", line 239, in _step result = coro.send(None) File "ki_bug.py", line 5, in bar raise KeyboardInterrupt KeyboardInterrupt We have several contradictory behaviors: the KeyboardInterrupt is raised, and captured by the future (since your can do task.exception() to suppress the stracktrace) but also catched by except while the program is allowed to continue, yet still the stack trace is displayed and eventually the program return code will be 0. It's very confusing. ---------- components: asyncio messages: 260984 nosy: Michel Desmoulin, gvanrossum, haypo, yselivanov priority: normal severity: normal status: open title: Inconsistent behavior with KeyboardInterrupt and asyncio futures type: behavior versions: Python 3.5 _______________________________________ Python tracker <rep...@bugs.python.org> <http://bugs.python.org/issue26455> _______________________________________ _______________________________________________ Python-bugs-list mailing list Unsubscribe: https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com