Python 坚韧:如果异常不是某种类型,如何重试?

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

如果异常不是某种类型,如何使用 Python 的韧性重试函数?

retry_if_exception_type 会在出现某种类型的异常时重试。 not 放在方法之前或参数之前似乎不起作用。

retry_unless_exception_type另一边,一直循环下去,即使没有出现错误,直到出现某种类型的错误。

使用 retry_unless_exception_type() 结合 stop_after_attempt() 为我实现了这一目标。 stop_after_attempt() 防止无限循环。

我必须为此创建自己的 class:

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

分解一下,你想要的是在以下情况下重试:

  • 出现异常
  • (and) 除非异常是某种类型

这样写:

retry_if_exception_type() & retry_unless_exception_type(ErrorClassToNotRetryOn)

retry_if_not_exception_type 自版本 8.0.0

起可用

Retries except an exception has been raised of one or more types.

因此,如果您使用 retry_if_not_exception_type((ValueError, OSError)),它将重试任何异常,ValueErrorOSError 除外。