[Python-checkins] cpython (3.4): Issue #23353: improve exceptions tests for generators

antoine.pitrou python-checkins at python.org
Wed Mar 18 22:25:13 CET 2015


https://hg.python.org/cpython/rev/ac43268da908
changeset:   95050:ac43268da908
branch:      3.4
parent:      95046:f6b773e1123e
user:        Antoine Pitrou <solipsis at pitrou.net>
date:        Wed Mar 18 22:22:46 2015 +0100
summary:
  Issue #23353: improve exceptions tests for generators

files:
  Lib/test/test_exceptions.py |  46 +++++++++++++++++++++++++
  1 files changed, 46 insertions(+), 0 deletions(-)


diff --git a/Lib/test/test_exceptions.py b/Lib/test/test_exceptions.py
--- a/Lib/test/test_exceptions.py
+++ b/Lib/test/test_exceptions.py
@@ -661,6 +661,52 @@
             pass
         self.assertEqual(sys.exc_info(), (None, None, None))
 
+    def test_generator_leaking3(self):
+        # See issue #23353.  When gen.throw() is called, the caller's
+        # exception state should be save and restored.
+        def g():
+            try:
+                yield
+            except ZeroDivisionError:
+                yield sys.exc_info()[1]
+        it = g()
+        next(it)
+        try:
+            1/0
+        except ZeroDivisionError as e:
+            self.assertIs(sys.exc_info()[1], e)
+            gen_exc = it.throw(e)
+            self.assertIs(sys.exc_info()[1], e)
+            self.assertIs(gen_exc, e)
+        self.assertEqual(sys.exc_info(), (None, None, None))
+
+    def test_generator_leaking4(self):
+        # See issue #23353.  When an exception is raised by a generator,
+        # the caller's exception state should still be restored.
+        def g():
+            try:
+                1/0
+            except ZeroDivisionError:
+                yield sys.exc_info()[0]
+                raise
+        it = g()
+        try:
+            raise TypeError
+        except TypeError:
+            # The caller's exception state (TypeError) is temporarily
+            # saved in the generator.
+            tp = next(it)
+        self.assertIs(tp, ZeroDivisionError)
+        try:
+            next(it)
+            # We can't check it immediately, but while next() returns
+            # with an exception, it shouldn't have restored the old
+            # exception state (TypeError).
+        except ZeroDivisionError as e:
+            self.assertIs(sys.exc_info()[1], e)
+        # We used to find TypeError here.
+        self.assertEqual(sys.exc_info(), (None, None, None))
+
     def test_generator_doesnt_retain_old_exc(self):
         def g():
             self.assertIsInstance(sys.exc_info()[1], RuntimeError)

-- 
Repository URL: https://hg.python.org/cpython


More information about the Python-checkins mailing list