Skip to content

Commit 01ee553

Browse files
committed
pythongh-92118: Add test for traceback when exception is modified by ExitStack.__exit__
1 parent e61330b commit 01ee553

File tree

1 file changed

+33
-0
lines changed

1 file changed

+33
-0
lines changed

Lib/test/test_contextlib.py

+33
Original file line numberDiff line numberDiff line change
@@ -748,6 +748,39 @@ def test_exit_suppress(self):
748748
stack.push(lambda *exc: True)
749749
1/0
750750

751+
def test_exit_exception_traceback(self):
752+
# This test captures the current behavior of ExitStack so that we know
753+
# if we ever unintendedly change it. It is not a statement of what the
754+
# desired behavior is (for instance, we may want to remove some of the
755+
# internal contextlib frames).
756+
757+
def raise_exc(exc):
758+
raise exc
759+
760+
try:
761+
with self.exit_stack() as stack:
762+
stack.callback(raise_exc, ValueError)
763+
1/0
764+
except ValueError as e:
765+
exc = e
766+
767+
self.assertIsInstance(exc, ValueError)
768+
ve_frames = traceback.extract_tb(exc.__traceback__)
769+
self.assertEqual(len(ve_frames), 5)
770+
self.assertEqual(
771+
[(f.name, f.line) for f in ve_frames],
772+
[('test_exit_exception_traceback', 'with self.exit_stack() as stack:'),
773+
('__exit__', 'raise exc_details[1]'),
774+
('__exit__', 'if cb(*exc_details):'),
775+
('_exit_wrapper', 'callback(*args, **kwds)'),
776+
('raise_exc', 'raise exc')])
777+
778+
self.assertIsInstance(exc.__context__, ZeroDivisionError)
779+
zde_frames = traceback.extract_tb(exc.__context__.__traceback__)
780+
self.assertEqual(len(zde_frames), 1)
781+
self.assertEqual([(f.name, f.line) for f in zde_frames],
782+
[('test_exit_exception_traceback', '1/0')])
783+
751784
def test_exit_exception_chaining_reference(self):
752785
# Sanity check to make sure that ExitStack chaining matches
753786
# actual nested with statements

0 commit comments

Comments
 (0)