Kaydet (Commit) bcc63a86 authored tarafından Antoine Pitrou's avatar Antoine Pitrou

Merged revisions 76573 via svnmerge from

svn+ssh://pythondev@svn.python.org/python/branches/py3k

........
  r76573 | antoine.pitrou | 2009-11-28 17:12:28 +0100 (sam., 28 nov. 2009) | 3 lines

  Issue #4486: When an exception has an explicit cause, do not print its implicit context too.
........
üst 875ada4b
......@@ -253,6 +253,26 @@ class BaseExceptionReportingTests:
self.check_zero_div(blocks[0])
self.assertTrue('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:
......
......@@ -120,13 +120,14 @@ def _iter_chain(exc, custom_tb=None, seen=None):
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:
......
......@@ -49,6 +49,10 @@ Core and Builtins
Library
-------
- Issue #4486: When an exception has an explicit cause, do not print its
implicit context too. This affects the `traceback` module as well as
built-in exception printing.
- Issue #1488943: difflib.Differ() doesn't always add hints for tab characters
- Issue #7354: distutils.tests.test_msvc9compiler - dragfullwindows can
......
......@@ -1576,7 +1576,7 @@ print_exception_recursive(PyObject *f, PyObject *value, PyObject *seen)
cause_message, f);
}
}
if (context) {
else if (context) {
res = PySet_Contains(seen, context);
if (res == -1)
PyErr_Clear();
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment