5

How to retry a function if the exception is NOT of a certain type using Python's tenacity?

retry_if_exception_type will retry if there is risen an exception of a certain type. not does not seems to work placed before the method nor before its arguments.

retry_unless_exception_type, on the other side, loops forever, even if there is not risen error, until there is risen error of a certain type.

ingyhere
  • 11,818
  • 3
  • 38
  • 52
Nikolay Shindarov
  • 1,616
  • 2
  • 18
  • 25

4 Answers4

3

retry_if_not_exception_type is available since version 8.0.0

Retries except an exception has been raised of one or more types.

So if you use retry_if_not_exception_type((ValueError, OSError)), it will retry for any exception, except ValueError or OSError.

congusbongus
  • 13,359
  • 7
  • 71
  • 99
1

I had to create my own class for that:

class retry_if_exception_unless_type(retry_unless_exception_type):
    """Retries until successful outcome or until an exception is raised of one or more types."""

    def __call__(self, retry_state):
        # don't retry if no exception was raised
        if not retry_state.outcome.failed:
            return False
        return self.predicate(retry_state.outcome.exception())
Jevgeni M.
  • 61
  • 4
  • 6
0

using retry_unless_exception_type() combined with stop_after_attempt() worked for me to accomplish this. the stop_after_attempt() prevents the infinite looping.

  • 2
    @retry(wait=wait_random_exponential(multiplier=3, max=30), stop=stop_after_attempt(5), reraise=True, retry=retry_unless_exception_type(NotFoundException)) – Ben Sachs Jan 29 '20 at 19:22
0

Breaking it down a bit, what you want is to retry if:

  • an exception is raised
  • (and) unless the exception is of a certain type

So write that:

retry_if_exception_type() & retry_unless_exception_type(ErrorClassToNotRetryOn)
mikenerone
  • 1,937
  • 3
  • 15
  • 19