2121import logging
2222import socket
2323import subprocess
24+ import traceback
2425import time
2526import os
2627import sys
@@ -290,7 +291,10 @@ def call_later(self, delay, callback, *args):
290291 Any positional arguments after the callback will be passed to
291292 the callback when it is called.
292293 """
293- return self .call_at (self .time () + delay , callback , * args )
294+ timer = self .call_at (self .time () + delay , callback , * args )
295+ if timer ._source_traceback :
296+ del timer ._source_traceback [- 1 ]
297+ return timer
294298
295299 def call_at (self , when , callback , * args ):
296300 """Like call_later(), but uses an absolute time."""
@@ -299,6 +303,8 @@ def call_at(self, when, callback, *args):
299303 if self ._debug :
300304 self ._assert_is_current_event_loop ()
301305 timer = events .TimerHandle (when , callback , args , self )
306+ if timer ._source_traceback :
307+ del timer ._source_traceback [- 1 ]
302308 heapq .heappush (self ._scheduled , timer )
303309 return timer
304310
@@ -312,14 +318,19 @@ def call_soon(self, callback, *args):
312318 Any positional arguments after the callback will be passed to
313319 the callback when it is called.
314320 """
315- return self ._call_soon (callback , args , check_loop = True )
321+ handle = self ._call_soon (callback , args , check_loop = True )
322+ if handle ._source_traceback :
323+ del handle ._source_traceback [- 1 ]
324+ return handle
316325
317326 def _call_soon (self , callback , args , check_loop ):
318327 if tasks .iscoroutinefunction (callback ):
319328 raise TypeError ("coroutines cannot be used with call_soon()" )
320329 if self ._debug and check_loop :
321330 self ._assert_is_current_event_loop ()
322331 handle = events .Handle (callback , args , self )
332+ if handle ._source_traceback :
333+ del handle ._source_traceback [- 1 ]
323334 self ._ready .append (handle )
324335 return handle
325336
@@ -344,6 +355,8 @@ def _assert_is_current_event_loop(self):
344355 def call_soon_threadsafe (self , callback , * args ):
345356 """Like call_soon(), but thread safe."""
346357 handle = self ._call_soon (callback , args , check_loop = False )
358+ if handle ._source_traceback :
359+ del handle ._source_traceback [- 1 ]
347360 self ._write_to_self ()
348361 return handle
349362
@@ -757,7 +770,14 @@ def default_exception_handler(self, context):
757770 for key in sorted (context ):
758771 if key in {'message' , 'exception' }:
759772 continue
760- log_lines .append ('{}: {!r}' .format (key , context [key ]))
773+ value = context [key ]
774+ if key == 'source_traceback' :
775+ tb = '' .join (traceback .format_list (value ))
776+ value = 'Object created at (most recent call last):\n '
777+ value += tb .rstrip ()
778+ else :
779+ value = repr (value )
780+ log_lines .append ('{}: {}' .format (key , value ))
761781
762782 logger .error ('\n ' .join (log_lines ), exc_info = exc_info )
763783
0 commit comments