Python tenacity: How to retry if exception is NOT of a certain type?

8.9k views Asked by At

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.

4

There are 4 answers

0
congusbongus On BEST ANSWER

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.

0
mikenerone On

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)
1
Ben Sachs On

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

0
Jevgeni M. On

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())