Упорство 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)
Не уверен, что здесь поможет рекурсивная функция.