diff --git a/dotflow/core/action.py b/dotflow/core/action.py index bddf1624..f3b45e70 100644 --- a/dotflow/core/action.py +++ b/dotflow/core/action.py @@ -166,7 +166,7 @@ def _run_action(self, *args, task=None, **kwargs): raise ExecutionWithClassError() from None if attempt == self.retry: - raise last_exception from last_exception + raise last_exception from None if task is not None: task.retry_count += 1 diff --git a/tests/core/test_action.py b/tests/core/test_action.py index 81c2dde7..84244c50 100644 --- a/tests/core/test_action.py +++ b/tests/core/test_action.py @@ -79,6 +79,21 @@ def flaky_step(): self.assertEqual(len(statuses), 1) self.assertEqual(statuses[0], TypeStatus.RETRY) + def test_retry_exception_does_not_chain_to_itself(self): + def always_fail(): + raise ValueError("fail") + + inside = Action(always_fail, retry=2, retry_delay=0) + + try: + inside() + except ValueError as error: + self.assertIsNot( + error.__cause__, + error, + "Exception must not be its own __cause__ (circular chain)", + ) + def test_backoff_does_not_mutate_retry_delay(self): def always_fail(): raise RuntimeError("fail")