@@ -249,31 +249,94 @@ def print_exception():
249249 sys .last_type , sys .last_value , sys .last_traceback = excinfo
250250 sys .last_exc = val
251251 seen = set ()
252+ exclude = ("run.py" , "rpc.py" , "threading.py" , "queue.py" ,
253+ "debugger_r.py" , "bdb.py" )
254+ max_group_width = 15
255+ max_group_depth = 10
256+ group_depth = 0
257+
258+ def print_exc_group (typ , exc , tb , prefix = "" ):
259+ nonlocal group_depth
260+ group_depth += 1
261+ prefix2 = prefix or " "
262+ if group_depth > max_group_depth :
263+ print (f"{ prefix2 } | ... (max_group_depth is { max_group_depth } )" ,
264+ file = efile )
265+ group_depth -= 1
266+ return
267+ if tb :
268+ if not prefix :
269+ print (" + Exception Group Traceback (most recent call last):" , file = efile )
270+ else :
271+ print (f"{ prefix } | Exception Group Traceback (most recent call last):" , file = efile )
272+ tbe = traceback .extract_tb (tb )
273+ cleanup_traceback (tbe , exclude )
274+ for line in traceback .format_list (tbe ):
275+ for subline in line .rstrip ().splitlines ():
276+ print (f"{ prefix2 } | { subline } " , file = efile )
277+ lines = get_message_lines (typ , exc , tb )
278+ for line in lines :
279+ print (f"{ prefix2 } | { line } " , end = "" , file = efile )
280+ num_excs = len (exc .exceptions )
281+ if num_excs <= max_group_width :
282+ n = num_excs
283+ else :
284+ n = max_group_width + 1
285+ for i , sub in enumerate (exc .exceptions [:n ], 1 ):
286+ truncated = (i > max_group_width )
287+ first_line_pre = "+-" if i == 1 else " "
288+ title = str (i ) if not truncated else '...'
289+ print (f"{ prefix2 } { first_line_pre } +---------------- { title } ----------------" , file = efile )
290+ if truncated :
291+ remaining = num_excs - max_group_width
292+ plural = 's' if remaining > 1 else ''
293+ print (f"{ prefix2 } | and { remaining } more exception{ plural } " ,
294+ file = efile )
295+ need_print_underline = True
296+ elif id (sub ) not in seen :
297+ if not prefix :
298+ print_exc (type (sub ), sub , sub .__traceback__ , " " )
299+ else :
300+ print_exc (type (sub ), sub , sub .__traceback__ , prefix + " " )
301+ need_print_underline = not isinstance (sub , BaseExceptionGroup )
302+ else :
303+ print (f"{ prefix2 } | <exception { type (sub ).__name__ } has printed>" , file = efile )
304+ need_print_underline = True
305+ if need_print_underline and i == n :
306+ print (f"{ prefix2 } +------------------------------------" , file = efile )
307+ group_depth -= 1
252308
253- def print_exc (typ , exc , tb ):
309+ def print_exc (typ , exc , tb , prefix = "" ):
254310 seen .add (id (exc ))
255311 context = exc .__context__
256312 cause = exc .__cause__
313+ prefix2 = f"{ prefix } | " if prefix else ""
257314 if cause is not None and id (cause ) not in seen :
258- print_exc (type (cause ), cause , cause .__traceback__ )
259- print (" \n The above exception was the direct cause "
260- "of the following exception:\n " , file = efile )
315+ print_exc (type (cause ), cause , cause .__traceback__ , prefix )
316+ print (f" { prefix2 } \n { prefix2 } The above exception was the direct cause "
317+ f "of the following exception:\n { prefix2 } " , file = efile )
261318 elif (context is not None and
262319 not exc .__suppress_context__ and
263320 id (context ) not in seen ):
264- print_exc (type (context ), context , context .__traceback__ )
265- print ("\n During handling of the above exception, "
266- "another exception occurred:\n " , file = efile )
267- if tb :
268- tbe = traceback .extract_tb (tb )
269- print ('Traceback (most recent call last):' , file = efile )
270- exclude = ("run.py" , "rpc.py" , "threading.py" , "queue.py" ,
271- "debugger_r.py" , "bdb.py" )
272- cleanup_traceback (tbe , exclude )
273- traceback .print_list (tbe , file = efile )
274- lines = get_message_lines (typ , exc , tb )
275- for line in lines :
276- print (line , end = '' , file = efile )
321+ print_exc (type (context ), context , context .__traceback__ , prefix )
322+ print (f"{ prefix2 } \n { prefix2 } During handling of the above exception, "
323+ f"another exception occurred:\n { prefix2 } " , file = efile )
324+ if isinstance (exc , BaseExceptionGroup ):
325+ print_exc_group (typ , exc , tb , prefix = prefix )
326+ else :
327+ if tb :
328+ print (f"{ prefix2 } Traceback (most recent call last):" , file = efile )
329+ tbe = traceback .extract_tb (tb )
330+ cleanup_traceback (tbe , exclude )
331+ if prefix :
332+ for line in traceback .format_list (tbe ):
333+ for subline in line .rstrip ().splitlines ():
334+ print (f"{ prefix } | { subline } " , file = efile )
335+ else :
336+ traceback .print_list (tbe , file = efile )
337+ lines = get_message_lines (typ , exc , tb )
338+ for line in lines :
339+ print (f"{ prefix2 } { line } " , end = "" , file = efile )
277340
278341 print_exc (typ , val , tb )
279342
0 commit comments