summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSerhiy Storchaka <storchaka@gmail.com>2013-01-09 10:21:57 (GMT)
committerSerhiy Storchaka <storchaka@gmail.com>2013-01-09 10:21:57 (GMT)
commit78470b4c3a423fb304438be269afbbdd2247d676 (patch)
tree86d7d215b4857fdd035d54f34990b56996ed29ce
parent48e188e57313813bd048e25b8fa6123b8cd5c9a0 (diff)
downloadcpython-78470b4c3a423fb304438be269afbbdd2247d676.zip
cpython-78470b4c3a423fb304438be269afbbdd2247d676.tar.gz
cpython-78470b4c3a423fb304438be269afbbdd2247d676.tar.bz2
Issue #16491: IDLE now prints chained exception tracebacks.
-rw-r--r--Lib/idlelib/run.py35
-rw-r--r--Misc/NEWS2
2 files changed, 28 insertions, 9 deletions
diff --git a/Lib/idlelib/run.py b/Lib/idlelib/run.py
index 5365680..b0a4794 100644
--- a/Lib/idlelib/run.py
+++ b/Lib/idlelib/run.py
@@ -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"
diff --git a/Misc/NEWS b/Misc/NEWS
index f51476a..029c930 100644
--- 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.