Упорство Python: как мне повторить попытку функции, не вызывая исключения, если все попытки не удались?

Скажем , у меня есть следующая функция:

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

Эта функция повторит попытку 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

3 ответа

В retry декоратор имеет retry_error_callback аргумент, который может переопределить поведение по умолчанию при поднятии 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

Рекомендуется контролировать исключение вне функции foo.

      try:
    foo()
except Exception as e:
    print("foo fails with retry: {e}")

Используя чистый питон:

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)

Не уверен, что здесь поможет рекурсивная функция.

Другие вопросы по тегам