Упорство Python: как повторить попытку, если исключение НЕ относится к определенному типу?
Как повторить попытку выполнения функции, если исключение НЕ относится к определенному типу, используя упорство Python?
retry_if_exception_type
повторит попытку, если возникнет исключение определенного типа. not
кажется, не работает ни перед методом, ни перед его аргументами.
retry_unless_exception_type
с другой стороны, цикл повторяется бесконечно, даже если не возникла ошибка, пока не возникнет ошибка определенного типа.
4 ответа
retry_if_not_exception_type
доступен с версии 8.0.0
Повторные попытки, за исключением исключения одного или нескольких типов.
Итак, если вы используете
retry_if_not_exception_type((ValueError, OSError))
, он повторит попытку для любого исключения, кроме
ValueError
или же
OSError
.
Для этого мне пришлось создать свой класс:
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())
С помощью retry_unless_exception_type()
в сочетании с stop_after_attempt()
работал у меня, чтобы добиться этого. вstop_after_attempt()
предотвращает бесконечное зацикливание.
Немного разбив его, вы хотите повторить попытку, если:
- возникает исключение
- (и) если исключение не относится к определенному типу
Так что напишите это:
retry_if_exception_type() & retry_unless_exception_type(ErrorClassToNotRetryOn)