File tree Expand file tree Collapse file tree 2 files changed +31
-14
lines changed
Filter options
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):
908
908
return outer
909
909
910
910
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 )
923
928
924
929
925
930
def shield (arg ):
@@ -987,8 +992,8 @@ def _outer_done_callback(outer):
987
992
if not inner .done ():
988
993
inner .remove_done_callback (_inner_done_callback )
989
994
# 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 )
992
997
993
998
if cur_task is not None :
994
999
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):
2116
2116
self .assertTrue (outer .cancelled ())
2117
2117
self .assertEqual (0 , 0 if outer ._callbacks is None else len (outer ._callbacks ))
2118
2118
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
+
2119
2131
def test_shield_cancel_outer_exception (self ):
2120
2132
mock_handler = mock .Mock ()
2121
2133
self .loop .set_exception_handler (mock_handler )
You can’t perform that action at this time.
0 commit comments