# HG changeset patch # User Antoine Pitrou # Date 1229460178 -3600 diff -r d2d6e0601fb7 -r 92050334323e Lib/test/test_traceback.py --- a/Lib/test/test_traceback.py +++ b/Lib/test/test_traceback.py @@ -239,6 +239,26 @@ self.check_zero_div(blocks[0]) self.assert_('inner_raise() # Marker' in blocks[2]) + def test_cause_and_context(self): + # When both a cause and a context are set, only the cause should be + # displayed and the context should be muted. + def inner_raise(): + try: + self.zero_div() + except ZeroDivisionError as _e: + e = _e + try: + xyzzy + except NameError: + raise KeyError from e + def outer_raise(): + inner_raise() # Marker + blocks = boundaries.split(self.get_report(outer_raise)) + self.assertEquals(len(blocks), 3) + self.assertEquals(blocks[1], cause_message) + self.check_zero_div(blocks[0]) + self.assert_('inner_raise() # Marker' in blocks[2]) + def test_cause_recursive(self): def inner_raise(): try: diff -r d2d6e0601fb7 -r 92050334323e Lib/traceback.py --- a/Lib/traceback.py +++ b/Lib/traceback.py @@ -120,13 +120,14 @@ seen.add(exc) its = [] cause = exc.__cause__ - context = exc.__context__ if cause is not None and cause not in seen: its.append(_iter_chain(cause, None, seen)) its.append([(_cause_message, None)]) - if context is not None and context is not cause and context not in seen: - its.append(_iter_chain(context, None, seen)) - its.append([(_context_message, None)]) + else: + context = exc.__context__ + if context is not None and context not in seen: + its.append(_iter_chain(context, None, seen)) + its.append([(_context_message, None)]) its.append([(exc, custom_tb or exc.__traceback__)]) # itertools.chain is in an extension module and may be unavailable for it in its: diff -r d2d6e0601fb7 -r 92050334323e Python/pythonrun.c --- a/Python/pythonrun.c +++ b/Python/pythonrun.c @@ -1477,7 +1477,7 @@ cause_message, f); } } - if (context) { + else if (context) { res = PySet_Contains(seen, context); if (res == -1) PyErr_Clear();