@@ -227,36 +227,45 @@ def _traceback_to_tuples(tb):
227227
228228
229229def _safe_string (value , what , func = str ,
230- exception_target = None , exception_exclude = None ,
231- _seen = threading .local ()):
232- if not hasattr (_seen , "_seen" ):
233- _seen ._seen = set ()
234- if not hasattr (_seen , "times" ):
235- _seen .times = 0
230+ exception_target = None , exception_exclude = None ):
236231 try :
237- _seen .times += 1
238232 return func (value )
239233 except :
240234 if isinstance (exception_target , list ):
241235 typ , val , tb = sys .exc_info ()
242- tb_tuple = _traceback_to_tuples (tb )
243- if tb_tuple not in _seen ._seen :
244- _seen ._seen .add (tb_tuple )
245- if exception_exclude :
246- _remove_exception (val , exception_exclude )
247- msg = "" .join (TracebackException (typ , val , tb ).format ())
248- while msg .endswith ("\n " ) or msg .endswith (" " ):
249- msg = msg [:- 1 ]
250- exception_target .append (
251- f"\n Exception ignored in { what } { func .__name__ } ():"
252- )
253- exception_target .append (msg )
236+ _add_exception_note (typ , val , tb , f"{ what } { func .__name__ } ()" ,
237+ exception_target , exception_exclude )
254238 return f"<{ what } { func .__name__ } () failed>"
255- finally :
256- _seen .times -= 1
257- if _seen .times <= 0 :
258- _seen .times = 0
259- _seen ._seen .clear ()
239+
240+
241+ _ADD_EXC_NOTE_LIMIT = 10
242+
243+
244+ def _add_exception_note (exc_type , exc_value , exc_tb , where ,
245+ exception_target , exception_exclude = None , _seen = threading .local ()):
246+ if not hasattr (_seen , "_seen" ):
247+ _seen ._seen = set ()
248+ if not hasattr (_seen , "times" ):
249+ _seen .times = 0
250+ if not isinstance (exception_target , list ):
251+ return
252+ _seen .times += 1
253+ tb_tuple = _traceback_to_tuples (exc_tb )
254+ if tb_tuple not in _seen ._seen and _seen .times <= _ADD_EXC_NOTE_LIMIT :
255+ _seen ._seen .add (tb_tuple )
256+ if exception_exclude :
257+ _remove_exception (exc_value , exception_exclude )
258+ msg = "" .join (TracebackException (exc_type , exc_value , exc_tb ).format ())
259+ while msg .endswith ("\n " ) or msg .endswith (" " ):
260+ msg = msg [:- 1 ]
261+ exception_target .append (
262+ f"\n Exception ignored in { where } :"
263+ )
264+ exception_target .append (msg )
265+ _seen .times -= 1
266+ if _seen .times <= 0 :
267+ _seen .times = 0
268+ _seen ._seen .clear ()
260269
261270# --
262271
@@ -1205,7 +1214,8 @@ def __init__(self, exc_type, exc_value, exc_traceback, *, limit=None,
12051214 i , "note" , str , exception_target , exc_value
12061215 )
12071216 )
1208- self .__notes__ = final_string_list + exception_target
1217+ self .__notes__ = final_string_list
1218+ self .exception_target = exception_target
12091219 if lookup_lines :
12101220 self ._load_lines ()
12111221 self .__suppress_context__ = (
@@ -1339,6 +1349,7 @@ def format_exception_only(self, *, show_group=False, _depth=0, **kwargs):
13391349 well, recursively, with indentation relative to their nesting depth.
13401350 """
13411351 colorize = kwargs .get ("colorize" , False )
1352+ exception_target = kwargs .get ("exception_target" , True )
13421353
13431354 indent = 3 * _depth * ' '
13441355 if not self ._have_exc_type :
@@ -1361,15 +1372,11 @@ def format_exception_only(self, *, show_group=False, _depth=0, **kwargs):
13611372 else :
13621373 yield from [indent + l for l in self ._format_syntax_error (stype , colorize = colorize )]
13631374
1364- if (
1365- isinstance (self .__notes__ , collections .abc .Sequence )
1366- and not isinstance (self .__notes__ , (str , bytes ))
1367- ):
1368- for note in self .__notes__ :
1369- note = _safe_string (note , 'note' )
1375+ for note in self .__notes__ :
1376+ yield from [indent + l + '\n ' for l in note .split ('\n ' )]
1377+ if exception_target :
1378+ for note in self .exception_target :
13701379 yield from [indent + l + '\n ' for l in note .split ('\n ' )]
1371- elif self .__notes__ is not None :
1372- yield indent + "{}\n " .format (_safe_string (self .__notes__ , '__notes__' , func = repr ))
13731380
13741381 if self .exceptions and show_group :
13751382 for ex in self .exceptions :
0 commit comments