[Python-checkins] cpython (3.2): Issue #16491: IDLE now prints chained exception tracebacks.

serhiy.storchaka python-checkins at python.org
Wed Jan 9 11:29:25 CET 2013


http://hg.python.org/cpython/rev/f28aff31900a
changeset:   81336:f28aff31900a
branch:      3.2
parent:      81329:4677c5f6fcf7
user:        Serhiy Storchaka <storchaka at gmail.com>
date:        Wed Jan 09 12:21:57 2013 +0200
summary:
  Issue #16491: IDLE now prints chained exception tracebacks.

files:
  Lib/idlelib/run.py |  35 +++++++++++++++++++++++++--------
  Misc/NEWS          |   2 +
  2 files changed, 28 insertions(+), 9 deletions(-)


diff --git a/Lib/idlelib/run.py b/Lib/idlelib/run.py
--- a/Lib/idlelib/run.py
+++ b/Lib/idlelib/run.py
@@ -158,15 +158,32 @@
     efile = sys.stderr
     typ, val, tb = excinfo = sys.exc_info()
     sys.last_type, sys.last_value, sys.last_traceback = excinfo
-    tbe = traceback.extract_tb(tb)
-    print('Traceback (most recent call last):', file=efile)
-    exclude = ("run.py", "rpc.py", "threading.py", "queue.py",
-               "RemoteDebugger.py", "bdb.py")
-    cleanup_traceback(tbe, exclude)
-    traceback.print_list(tbe, file=efile)
-    lines = traceback.format_exception_only(typ, val)
-    for line in lines:
-        print(line, end='', file=efile)
+    seen = set()
+
+    def print_exc(typ, exc, tb):
+        seen.add(exc)
+        context = exc.__context__
+        cause = exc.__cause__
+        if cause is not None and cause not in seen:
+            print_exc(type(cause), cause, cause.__traceback__)
+            print("\nThe above exception was the direct cause "
+                  "of the following exception:\n", file=efile)
+        elif context is not None and context not in seen:
+            print_exc(type(context), context, context.__traceback__)
+            print("\nDuring handling of the above exception, "
+                  "another exception occurred:\n", file=efile)
+        if tb:
+            tbe = traceback.extract_tb(tb)
+            print('Traceback (most recent call last):', file=efile)
+            exclude = ("run.py", "rpc.py", "threading.py", "queue.py",
+                       "RemoteDebugger.py", "bdb.py")
+            cleanup_traceback(tbe, exclude)
+            traceback.print_list(tbe, file=efile)
+        lines = traceback.format_exception_only(typ, exc)
+        for line in lines:
+            print(line, end='', file=efile)
+
+    print_exc(typ, val, tb)
 
 def cleanup_traceback(tb, exclude):
     "Remove excluded traces from beginning/end of tb; get cached lines"
diff --git a/Misc/NEWS b/Misc/NEWS
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -199,6 +199,8 @@
 Library
 -------
 
+- Issue #16491: IDLE now prints chained exception tracebacks.
+
 - Issue #16828: Fix error incorrectly raised by bz2.compress(''). Patch by
   Martin Packman.
 

-- 
Repository URL: http://hg.python.org/cpython


More information about the Python-checkins mailing list