]> granicus.if.org Git - python/commitdiff
Issue #16491: IDLE now prints chained exception tracebacks.
authorSerhiy Storchaka <storchaka@gmail.com>
Wed, 9 Jan 2013 10:21:57 +0000 (12:21 +0200)
committerSerhiy Storchaka <storchaka@gmail.com>
Wed, 9 Jan 2013 10:21:57 +0000 (12:21 +0200)
Lib/idlelib/run.py
Misc/NEWS

index 53656806d6d8e44da2376b043b36052777728968..b0a47942311eb6e8ffa8d6f29f23edcd709ef5dd 100644 (file)
@@ -158,15 +158,32 @@ def print_exception():
     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"
index f51476aab4b76ef90af931506d59dcb29e01c0d5..029c93007d8fef042b7bcf87a49fbc9cd90837d9 100644 (file)
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -199,6 +199,8 @@ Core and Builtins
 Library
 -------
 
+- Issue #16491: IDLE now prints chained exception tracebacks.
+
 - Issue #16828: Fix error incorrectly raised by bz2.compress(''). Patch by
   Martin Packman.