Skip to content

Commit 5caf095

Browse files
committed
Swallowing a BaseException is not allowed.
1 parent af00aba commit 5caf095

File tree

3 files changed

+26
-13
lines changed

3 files changed

+26
-13
lines changed

transitions/core.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -422,7 +422,7 @@ def _trigger(self, event_data):
422422
event_data.error = err
423423
if self.machine.on_exception:
424424
self.machine.callbacks(self.machine.on_exception, event_data)
425-
else:
425+
if not self.machine.on_exception or not isinstance(err, Exception):
426426
raise
427427
finally:
428428
try:
@@ -917,7 +917,7 @@ def _can_trigger(self, model, trigger, *args, **kwargs):
917917
event_data.error = err
918918
if self.on_exception:
919919
self.callbacks(self.on_exception, event_data)
920-
else:
920+
if not self.on_exception or not isinstance(err, BaseException):
921921
raise
922922
return False
923923

transitions/extensions/asyncio.py

Lines changed: 20 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
from collections import deque
2424
from functools import partial, reduce
2525
import copy
26+
from concurrent.futures import CancelledError
2627

2728
from ..core import State, Condition, Transition, EventData, listify
2829
from ..core import Event, MachineError, Machine
@@ -197,20 +198,25 @@ async def _trigger(self, event_data):
197198
except BaseException as err: # pylint: disable=broad-except; Exception will be handled elsewhere
198199
_LOGGER.error("%sException was raised while processing the trigger '%s': %s",
199200
self.machine.name, event_data.event.name, repr(err))
200-
event_data.error = err
201+
event_data.error = err if isinstance(err,Exception) else CancelledError()
202+
201203
if self.machine.on_exception:
202-
await self.machine.callbacks(self.machine.on_exception, event_data)
203-
else:
204+
with anyio.move_on_after(2, shield=True):
205+
await self.machine.callbacks(self.machine.on_exception, event_data)
206+
if not self.machine.on_exception or not isinstance(err, Exception):
204207
raise
205208
finally:
206209
try:
207-
await self.machine.callbacks(self.machine.finalize_event, event_data)
210+
with anyio.CancelScope(shield=True):
211+
await self.machine.callbacks(self.machine.finalize_event, event_data)
208212
_LOGGER.debug("%sExecuted machine finalize callbacks", self.machine.name)
209213
except BaseException as err: # pylint: disable=broad-except; Exception will be handled elsewhere
210214
_LOGGER.error("%sWhile executing finalize callbacks a %s occurred: %s.",
211215
self.machine.name,
212216
type(err).__name__,
213217
str(err))
218+
if not isinstance(err, Exception):
219+
raise
214220
return event_data.result
215221

216222
async def _process(self, event_data):
@@ -481,7 +487,7 @@ async def _can_trigger(self, model, trigger, *args, **kwargs):
481487
event_data.error = err
482488
if self.on_exception:
483489
await self.callbacks(self.on_exception, event_data)
484-
else:
490+
if not self.on_exception or not isinstance(err, Exception):
485491
raise
486492
return False
487493

@@ -556,7 +562,7 @@ async def _trigger_event(self, event_data, trigger):
556562
event_data.error = err
557563
if self.on_exception:
558564
await self.callbacks(self.on_exception, event_data)
559-
else:
565+
if not self.on_exception or not isinstance(err, Exception):
560566
raise
561567
finally:
562568
try:
@@ -567,6 +573,8 @@ async def _trigger_event(self, event_data, trigger):
567573
self.name,
568574
type(err).__name__,
569575
str(err))
576+
if not isinstance(err, Exception):
577+
raise
570578
return event_data.result
571579

572580
async def _trigger_event_nested(self, event_data, _trigger, _state_tree):
@@ -616,7 +624,7 @@ async def _can_trigger_nested(self, model, trigger, path, *args, **kwargs):
616624
event_data.error = err
617625
if self.on_exception:
618626
await self.callbacks(self.on_exception, event_data)
619-
else:
627+
if not self.on_exception or not isinstance(err, Exception):
620628
raise
621629
source_path.pop(-1)
622630
if path:
@@ -711,16 +719,19 @@ async def _process_timeout(self, event_data):
711719
except BaseException as err:
712720
_LOGGER.warning("%sException raised while processing timeout!",
713721
event_data.machine.name)
714-
event_data.error = err
722+
event_data.error = err if isinstance(err,Exception) else CancelledError()
715723
try:
716724
if event_data.machine.on_exception:
717725
await event_data.machine.callbacks(event_data.machine.on_exception, event_data)
718-
else:
726+
# always re-raise BaseException!
727+
if not event_data.machine.on_exception or not isinstance(err, Exception):
719728
raise
720729
except BaseException as err2:
721730
_LOGGER.error("%sHandling timeout exception '%s' caused another exception: %s. "
722731
"Cancel running transitions...", event_data.machine.name, repr(err), repr(err2))
723732
await event_data.machine.cancel_running_transitions(event_data.model)
733+
if not isinstance(err, Exception):
734+
raise
724735
finally:
725736
AsyncMachine.current_context.reset(token)
726737
_LOGGER.info("%sTimeout state %s processed.", event_data.machine.name, self.name)

transitions/extensions/nesting.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -790,7 +790,7 @@ def _can_trigger_nested(self, model, trigger, path, *args, **kwargs):
790790
event_data.error = err
791791
if self.on_exception:
792792
self.callbacks(self.on_exception, event_data)
793-
else:
793+
if not self.on_exception or not isinstance(err, Exception):
794794
raise
795795
source_path.pop(-1)
796796
if path:
@@ -916,7 +916,7 @@ def _trigger_event(self, event_data, trigger):
916916
event_data.error = err
917917
if self.on_exception:
918918
self.callbacks(self.on_exception, event_data)
919-
else:
919+
if not self.on_exception or not isinstance(err, Exception):
920920
raise
921921
finally:
922922
try:
@@ -927,6 +927,8 @@ def _trigger_event(self, event_data, trigger):
927927
self.name,
928928
type(err).__name__,
929929
str(err))
930+
if not isinstance(err, Exception):
931+
raise
930932
return event_data.result
931933

932934
def _add_model_to_state(self, state, model):

0 commit comments

Comments
 (0)