Don't use yield/yield-from in an except block of a generator. Store the
exception and handle it outside the except block.
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():
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
**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