mirror of
https://github.com/python/cpython.git
synced 2025-10-09 08:31:26 +00:00
Issue #27123: When an exception is raised within the context being
managed by a contextlib.ExitStack() and one of the exit stack generators catches and raises it in a chain, do not re-raise the original exception when exiting, let the new chained one through. This avoids the PEP 479 bug described in issue25782.
This commit is contained in:
commit
881aa38972
3 changed files with 37 additions and 0 deletions
|
@ -795,6 +795,34 @@ class TestExitStack(unittest.TestCase):
|
|||
stack.push(cm)
|
||||
self.assertIs(stack._exit_callbacks[-1], cm)
|
||||
|
||||
def test_dont_reraise_RuntimeError(self):
|
||||
"""https://bugs.python.org/issue27122"""
|
||||
class UniqueException(Exception): pass
|
||||
|
||||
@contextmanager
|
||||
def second():
|
||||
try:
|
||||
yield 1
|
||||
except Exception as exc:
|
||||
raise UniqueException("new exception") from exc
|
||||
|
||||
@contextmanager
|
||||
def first():
|
||||
try:
|
||||
yield 1
|
||||
except Exception as exc:
|
||||
raise exc
|
||||
|
||||
# The RuntimeError should be caught by second()'s exception
|
||||
# handler which chain raised a new UniqueException.
|
||||
with self.assertRaises(UniqueException) as err_ctx:
|
||||
with ExitStack() as es_ctx:
|
||||
es_ctx.enter_context(second())
|
||||
es_ctx.enter_context(first())
|
||||
raise RuntimeError("please no infinite loop.")
|
||||
|
||||
self.assertEqual(err_ctx.exception.args[0], "new exception")
|
||||
|
||||
|
||||
class TestRedirectStream:
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue