'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 |
