@@ -158,15 +158,32 @@ def print_exception():
158158 efile = sys .stderr
159159 typ , val , tb = excinfo = sys .exc_info ()
160160 sys .last_type , sys .last_value , sys .last_traceback = excinfo
161- tbe = traceback .extract_tb (tb )
162- print ('Traceback (most recent call last):' , file = efile )
163- exclude = ("run.py" , "rpc.py" , "threading.py" , "queue.py" ,
164- "RemoteDebugger.py" , "bdb.py" )
165- cleanup_traceback (tbe , exclude )
166- traceback .print_list (tbe , file = efile )
167- lines = traceback .format_exception_only (typ , val )
168- for line in lines :
169- print (line , end = '' , file = efile )
161+ seen = set ()
162+
163+ def print_exc (typ , exc , tb ):
164+ seen .add (exc )
165+ context = exc .__context__
166+ cause = exc .__cause__
167+ if cause is not None and cause not in seen :
168+ print_exc (type (cause ), cause , cause .__traceback__ )
169+ print ("\n The above exception was the direct cause "
170+ "of the following exception:\n " , file = efile )
171+ elif context is not None and context not in seen :
172+ print_exc (type (context ), context , context .__traceback__ )
173+ print ("\n During handling of the above exception, "
174+ "another exception occurred:\n " , file = efile )
175+ if tb :
176+ tbe = traceback .extract_tb (tb )
177+ print ('Traceback (most recent call last):' , file = efile )
178+ exclude = ("run.py" , "rpc.py" , "threading.py" , "queue.py" ,
179+ "RemoteDebugger.py" , "bdb.py" )
180+ cleanup_traceback (tbe , exclude )
181+ traceback .print_list (tbe , file = efile )
182+ lines = traceback .format_exception_only (typ , exc )
183+ for line in lines :
184+ print (line , end = '' , file = efile )
185+
186+ print_exc (typ , val , tb )
170187
171188def cleanup_traceback (tb , exclude ):
172189 "Remove excluded traces from beginning/end of tb; get cached lines"
0 commit comments