diff options
author | Serhiy Storchaka <storchaka@gmail.com> | 2013-01-09 10:26:54 (GMT) |
---|---|---|
committer | Serhiy Storchaka <storchaka@gmail.com> | 2013-01-09 10:26:54 (GMT) |
commit | df558cb3b1f6e766e17a203856fb38eae1d3a366 (patch) | |
tree | 35308cc796f8cd391b353d49db3e686279fa3349 /Lib/idlelib/run.py | |
parent | 2f3be0f1d8b865b83149514e35d39c5241546bdd (diff) | |
parent | 7131749959e674ae347e34efabdc6291b21cbe43 (diff) | |
download | cpython-df558cb3b1f6e766e17a203856fb38eae1d3a366.zip cpython-df558cb3b1f6e766e17a203856fb38eae1d3a366.tar.gz cpython-df558cb3b1f6e766e17a203856fb38eae1d3a366.tar.bz2 |
Issue #16491: IDLE now prints chained exception tracebacks.
Diffstat (limited to 'Lib/idlelib/run.py')
-rw-r--r-- | Lib/idlelib/run.py | 37 |
1 files changed, 28 insertions, 9 deletions
diff --git a/Lib/idlelib/run.py b/Lib/idlelib/run.py index 5d321af..41e4bf9 100644 --- a/Lib/idlelib/run.py +++ b/Lib/idlelib/run.py @@ -171,15 +171,34 @@ 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 + not exc.__suppress_context__ 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" |