Python 坚韧:如果所有重试都失败,如何重试函数而不引发异常?

JTa*_*JTa 8 python python-requests python-tenacity

假设我有以下功能:

@retry(stop=stop_after_attempt(3))
def foo():
  try:
    response = requests.post(...)
    response.raise_for_status()
    return response
  except Exception as e:
    raise e
Run Code Online (Sandbox Code Playgroud)

该函数将重试 3 次,如果 3 次重试均失败,则会引发异常。

如何使用坚韧重试 3 次而不引发异常?就像是:

@retry(stop=stop_after_attempt(3))
def foo(ignore_errors=False):
  try:
    response = requests.post(...)
    response.raise_for_status()
    return response
  except Exception as e:
    if ignore_errors and function has been retried three times:
      pass
    raise e
Run Code Online (Sandbox Code Playgroud)

小智 12

装饰retry器有一个retry_error_callback参数,可以覆盖在所有重试失败时引发 a 的默认行为RetryError。该参数应该是一个接受一个参数(称为 )的函数retry_state,如果您从此函数返回一个值,则当所有重试失败时,该函数将返回该值。

一个例子:

from tenacity import retry, stop_after_attempt

return_value_on_error = "something"

@retry(
    stop=stop_after_attempt(3),
    retry_error_callback=lambda retry_state: return_value_on_error,
)
def broken_function():
    raise RuntimeError

assert broken_function() == return_value_on_error
Run Code Online (Sandbox Code Playgroud)

  • 如果我想在所有尝试失败时调用带有参数的特定函数怎么办?有办法做到这一点吗? (2认同)

Moo*_*ter -6

使用纯Python:

def foo(tries=0,maxTries=3):
    try:
        response = requests.post(...)
        response.raise_for_status()
        return response
    except Exception as e:
        if tries>=maxTries:
            print("Maxtries reached.")
            return
        else:
            foo(tries+1,maxTries)
Run Code Online (Sandbox Code Playgroud)

我不确定递归函数在这里是否有帮助。