[Python-checkins] r76574 - in python/branches/release31-maint: Lib/test/test_traceback.py Lib/traceback.py Misc/NEWS Python/pythonrun.c

antoine.pitrou python-checkins at python.org
Sat Nov 28 17:16:09 CET 2009


Author: antoine.pitrou
Date: Sat Nov 28 17:16:09 2009
New Revision: 76574

Log:
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.
........


Modified:
   python/branches/release31-maint/   (props changed)
   python/branches/release31-maint/Lib/test/test_traceback.py
   python/branches/release31-maint/Lib/traceback.py
   python/branches/release31-maint/Misc/NEWS
   python/branches/release31-maint/Python/pythonrun.c

Modified: python/branches/release31-maint/Lib/test/test_traceback.py
==============================================================================
--- python/branches/release31-maint/Lib/test/test_traceback.py	(original)
+++ python/branches/release31-maint/Lib/test/test_traceback.py	Sat Nov 28 17:16:09 2009
@@ -253,6 +253,26 @@
         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:

Modified: python/branches/release31-maint/Lib/traceback.py
==============================================================================
--- python/branches/release31-maint/Lib/traceback.py	(original)
+++ python/branches/release31-maint/Lib/traceback.py	Sat Nov 28 17:16:09 2009
@@ -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:

Modified: python/branches/release31-maint/Misc/NEWS
==============================================================================
--- python/branches/release31-maint/Misc/NEWS	(original)
+++ python/branches/release31-maint/Misc/NEWS	Sat Nov 28 17:16:09 2009
@@ -49,6 +49,10 @@
 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 

Modified: python/branches/release31-maint/Python/pythonrun.c
==============================================================================
--- python/branches/release31-maint/Python/pythonrun.c	(original)
+++ python/branches/release31-maint/Python/pythonrun.c	Sat Nov 28 17:16:09 2009
@@ -1576,7 +1576,7 @@
 						cause_message, f);
 				}
 			}
-			if (context) {
+			else if (context) {
 				res = PySet_Contains(seen, context);
 				if (res == -1)
 					PyErr_Clear();


More information about the Python-checkins mailing list