diff Lib/test/test_contextlib.py @ 77282:c108bc96aec6

Close #14969: Improve the handling of exception chaining in contextlib.ExitStack
author Nick Coghlan <ncoghlan@gmail.com>
date Fri, 01 Jun 2012 22:48:32 +1000
parents c0c7618762e5
children 423736775f6b 406b47c64480
line wrap: on
line diff
--- a/Lib/test/test_contextlib.py	Fri Jun 01 11:48:32 2012 +0200
+++ b/Lib/test/test_contextlib.py	Fri Jun 01 22:48:32 2012 +1000
@@ -505,6 +505,18 @@
             def __exit__(self, *exc_details):
                 raise self.exc
 
+        class RaiseExcWithContext:
+            def __init__(self, outer, inner):
+                self.outer = outer
+                self.inner = inner
+            def __enter__(self):
+                return self
+            def __exit__(self, *exc_details):
+                try:
+                    raise self.inner
+                except:
+                    raise self.outer
+
         class SuppressExc:
             def __enter__(self):
                 return self
@@ -514,11 +526,10 @@
 
         try:
             with RaiseExc(IndexError):
-                with RaiseExc(KeyError):
-                    with RaiseExc(AttributeError):
-                        with SuppressExc():
-                            with RaiseExc(ValueError):
-                                1 / 0
+                with RaiseExcWithContext(KeyError, AttributeError):
+                    with SuppressExc():
+                        with RaiseExc(ValueError):
+                            1 / 0
         except IndexError as exc:
             self.assertIsInstance(exc.__context__, KeyError)
             self.assertIsInstance(exc.__context__.__context__, AttributeError)
@@ -553,12 +564,8 @@
         except IndexError as exc:
             self.assertIsInstance(exc.__context__, KeyError)
             self.assertIsInstance(exc.__context__.__context__, AttributeError)
-            # Inner exceptions were suppressed, but the with statement
-            # cleanup code adds the one from the body back in as the
-            # context of the exception raised by the outer callbacks
-            # See http://bugs.python.org/issue14969
-            suite_exc = exc.__context__.__context__.__context__
-            self.assertIsInstance(suite_exc, ZeroDivisionError)
+            # Inner exceptions were suppressed
+            self.assertIsNone(exc.__context__.__context__.__context__)
         else:
             self.fail("Expected IndexError, but no exception was raised")
         # Check the inner exceptions