File tree Expand file tree Collapse file tree 2 files changed +31
-14
lines changed
Expand file tree Collapse file tree 2 files changed +31
-14
lines changed Original file line number Diff line number Diff line change @@ -908,18 +908,23 @@ def _done_callback(fut, cur_task=cur_task):
908908 return outer
909909
910910
911- def _log_on_cancel_callback (inner ):
912- if not inner .cancelled ():
913- exc = inner .exception ()
914- context = {
915- 'message' :
916- f'{ exc .__class__ .__name__ } exception in shielded future' ,
917- 'exception' : exc ,
918- 'future' : inner ,
919- }
920- if inner ._source_traceback :
921- context ['source_traceback' ] = inner ._source_traceback
922- inner ._loop .call_exception_handler (context )
911+ def _log_on_exception (fut ):
912+ if fut .cancelled ():
913+ return
914+
915+ exc = fut .exception ()
916+ if exc is None :
917+ return
918+
919+ context = {
920+ 'message' :
921+ f'{ exc .__class__ .__name__ } exception in shielded future' ,
922+ 'exception' : exc ,
923+ 'future' : fut ,
924+ }
925+ if fut ._source_traceback :
926+ context ['source_traceback' ] = fut ._source_traceback
927+ fut ._loop .call_exception_handler (context )
923928
924929
925930def shield (arg ):
@@ -987,8 +992,8 @@ def _outer_done_callback(outer):
987992 if not inner .done ():
988993 inner .remove_done_callback (_inner_done_callback )
989994 # Keep only one callback to log on cancel
990- inner .remove_done_callback (_log_on_cancel_callback )
991- inner .add_done_callback (_log_on_cancel_callback )
995+ inner .remove_done_callback (_log_on_exception )
996+ inner .add_done_callback (_log_on_exception )
992997
993998 if cur_task is not None :
994999 inner .add_done_callback (_clear_awaited_by_callback )
Original file line number Diff line number Diff line change @@ -2116,6 +2116,18 @@ def test_shield_cancel_outer(self):
21162116 self .assertTrue (outer .cancelled ())
21172117 self .assertEqual (0 , 0 if outer ._callbacks is None else len (outer ._callbacks ))
21182118
2119+ def test_shield_cancel_outer_result (self ):
2120+ mock_handler = mock .Mock ()
2121+ self .loop .set_exception_handler (mock_handler )
2122+ inner = self .new_future (self .loop )
2123+ outer = asyncio .shield (inner )
2124+ test_utils .run_briefly (self .loop )
2125+ outer .cancel ()
2126+ test_utils .run_briefly (self .loop )
2127+ inner .set_result (1 )
2128+ test_utils .run_briefly (self .loop )
2129+ mock_handler .assert_not_called ()
2130+
21192131 def test_shield_cancel_outer_exception (self ):
21202132 mock_handler = mock .Mock ()
21212133 self .loop .set_exception_handler (mock_handler )
You can’t perform that action at this time.
0 commit comments