mirror of
https://github.com/python/cpython.git
synced 2025-08-30 13:38:43 +00:00
Close #14969: Improve the handling of exception chaining in contextlib.ExitStack
This commit is contained in:
parent
c4b78a3e15
commit
77452fc121
3 changed files with 33 additions and 14 deletions
|
@ -505,6 +505,18 @@ class TestExitStack(unittest.TestCase):
|
|||
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 @@ class TestExitStack(unittest.TestCase):
|
|||
|
||||
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 @@ class TestExitStack(unittest.TestCase):
|
|||
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
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue