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