changeset: 94464:2cd6621a9fbc branch: 3.4 parent: 94461:7d1c32ddc432 user: Victor Stinner date: Mon Feb 02 18:36:31 2015 +0100 files: Lib/asyncio/test_utils.py Lib/asyncio/unix_events.py Lib/asyncio/windows_events.py description: Issue #23353, asyncio: Workaround CPython bug #23353 Don't use yield/yield-from in an except block of a generator. Store the exception and handle it outside the except block. diff -r 7d1c32ddc432 -r 2cd6621a9fbc Lib/asyncio/test_utils.py --- a/Lib/asyncio/test_utils.py Mon Feb 02 10:51:20 2015 -0500 +++ b/Lib/asyncio/test_utils.py Mon Feb 02 18:36:31 2015 +0100 @@ -416,6 +416,10 @@ def tearDown(self): events.set_event_loop(None) + # Detect CPython bug #23353: ensure that yield/yield-from is not used + # in an except block of a generator + self.assertEqual(sys.exc_info(), (None, None, None)) + @contextlib.contextmanager def disable_logger(): diff -r 7d1c32ddc432 -r 2cd6621a9fbc Lib/asyncio/unix_events.py --- a/Lib/asyncio/unix_events.py Mon Feb 02 10:51:20 2015 -0500 +++ b/Lib/asyncio/unix_events.py Mon Feb 02 18:36:31 2015 +0100 @@ -186,10 +186,18 @@ self._child_watcher_callback, transp) try: yield from waiter - except: + except Exception as exc: + # Workaround CPython bug #23353: using yield/yield-from in an + # except block of a generator doesn't clear properly + # sys.exc_info() + err = exc + else: + err = None + + if err is not None: transp.close() yield from transp._wait() - raise + raise err return transp diff -r 7d1c32ddc432 -r 2cd6621a9fbc Lib/asyncio/windows_events.py --- a/Lib/asyncio/windows_events.py Mon Feb 02 10:51:20 2015 -0500 +++ b/Lib/asyncio/windows_events.py Mon Feb 02 18:36:31 2015 +0100 @@ -373,10 +373,17 @@ **kwargs) try: yield from waiter - except: + except Exception as exc: + # Workaround CPython bug #23353: using yield/yield-from in an + # except block of a generator doesn't clear properly sys.exc_info() + err = exc + else: + err = None + + if err is not None: transp.close() yield from transp._wait() - raise + raise err return transp