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))
,它将重试任何异常,ValueError
或 OSError
除外。
如果异常不是某种类型,如何使用 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))
,它将重试任何异常,ValueError
或 OSError
除外。