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"  | 
