Как повторить попытку после исключения? - PullRequest
201 голосов
/ 18 января 2010

У меня есть цикл, начинающийся с for i in range(0, 100).Обычно он работает правильно, но иногда происходит сбой из-за условий сети.В настоящее время он настроен таким образом, чтобы при сбое он был continue в предложении кроме (переходите к следующему номеру для i).

Могу ли я переназначить тот же номер на i и снова выполнить неудачную итерацию цикла?

Ответы [ 16 ]

2 голосов
/ 18 октября 2017

Вы можете использовать пакет повторных попыток Python. Повторная

Он написан на Python, чтобы упростить задачу добавления поведения повтора практически ко всему.

2 голосов
/ 31 августа 2016

Использование while и счетчика:

count = 1
while count <= 3:  # try 3 times
    try:
        # do_the_logic()
        break
    except SomeSpecificException as e:
        # If trying 3rd time and still error?? 
        # Just throw the error- we don't have anything to hide :)
        if count == 3:
            raise
        count += 1
1 голос
/ 25 июля 2018

Если вам нужно решение без вложенных циклов и при успешном вызове break, вы можете разработать быструю оболочку retriable для любой итерации. Вот пример проблемы с сетью, с которой я часто сталкиваюсь - срок сохраненной аутентификации истекает. Использование этого будет выглядеть так:

client = get_client()
smart_loop = retriable(list_of_values):

for value in smart_loop:
    try:
        client.do_something_with(value)
    except ClientAuthExpired:
        client = get_client()
        smart_loop.retry()
        continue
    except NetworkTimeout:
        smart_loop.retry()
        continue
0 голосов
/ 21 ноября 2018

Я использую следующие в моих кодах,

   for i in range(0, 10):
    try:
        #things I need to do
    except ValueError:
        print("Try #{} failed with ValueError: Sleeping for 2 secs before next try:".format(i))
        time.sleep(2)
        continue
    break
0 голосов
/ 24 декабря 2015

Вот моя идея, как это исправить:

j = 19
def calc(y):
    global j
    try:
        j = j + 8 - y
        x = int(y/j)   # this will eventually raise DIV/0 when j=0
        print("i = ", str(y), " j = ", str(j), " x = ", str(x))
    except:
        j = j + 1   # when the exception happens, increment "j" and retry
        calc(y)
for i in range(50):
    calc(i)
0 голосов
/ 18 января 2010

увеличивает переменную цикла только тогда, когда предложение try успешно выполняется

...