Упорство 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)
Другие вопросы по тегам