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

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.



Solution 1:[1]

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.

Solution 2:[2]

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

Solution 3:[3]

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

Solution 4:[4]

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)

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 congusbongus
Solution 2 Ben Sachs
Solution 3 Jevgeni M.
Solution 4