У меня есть цикл, начинающийся с for i in range(0, 100)
. Обычно он работает правильно, но иногда происходит сбой из-за условий сети. В настоящее время он настроен таким образом, что в случае сбоя он будет continue
указан в условии "исключение" (перейдите к следующему номеру для i
).
Могу ли я переназначить тот же номер и снова i
выполнить неудачную итерацию цикла?
python
loops
exception
try-except
FurtiveFelon
источник
источник
range(100)
без первого параметра. Если вы используете Python 2.x, который вы могли бы использоватьxrange(100)
, он генерирует итератор и использует меньше памяти. (Не то, чтобы этоОтветы:
Сделайте
while True
внутри вашего цикла for, поместите свойtry
код внутрь, и выходите из этогоwhile
цикла только тогда, когда ваш код завершится успешно.источник
continue
повторитwhile
цикл, конечно, неfor
, так (!)i
это не «следующий» ничего - это точно так же , как это было на предыдущей (неудачной) нога одного и того жеwhile
, конечно.Я предпочитаю ограничить количество повторных попыток, чтобы в случае возникновения проблемы с этим конкретным элементом вы в конечном итоге переходили к следующему, таким образом:
источник
else:
пунктfor
.else
пунктtry
делает это "если успешно, то сломай", что вы ищете.except
предложения, и не забывайте использовать 9, а не 10.Пакет повторных попыток - хороший способ повторить блок кода при ошибке.
Например:
источник
Вот решение, подобное другим, но оно вызовет исключение, если оно не преуспеет в предписанном количестве или повторных попытках.
источник
retries
вводит в заблуждение. Это должно быть гораздо лучшеtries
.Более «функциональный» подход без использования этих уродливых циклов while:
источник
except: tryAgain(retries+1)
Самый ясный способ был бы явно установить
i
. Например:источник
i += 1
сразу после# do stuff
.range
для такого рода вещей.Общее решение с таймаутом:
Использование:
источник
except exception:
try … except
вы можете использоватьif
утверждение. Но это менее питонно.callback
функция никогда не вызывается. Я забыл скобку, заменить наcallback()
.Моя версия аналогична нескольким из вышеперечисленных, но не использует отдельный
while
цикл и повторно вызывает последнее исключение, если все попытки повторяются. Может быть явно установленerr = None
вверху, но не является строго необходимым, так как он должен выполнять только последнийelse
блок, если произошла ошибка и, следовательно,err
он установлен.источник
В библиотеке Python Decorator есть нечто похожее .
Пожалуйста, имейте в виду, что это не проверка исключений, а возвращаемое значение. Повторяется до тех пор, пока оформленная функция не вернет True.
Немного измененная версия должна сделать свое дело.
источник
Используя while и счетчик:
источник
Использование рекурсии
источник
Вы можете использовать пакет повторных попыток Python. Повторная попытка
Он написан на Python, чтобы упростить задачу добавления поведения повтора практически ко всему.
источник
Альтернативы
retrying
:tenacity
иbackoff
(обновление 2020 года)Повторная попытка библиотека была ранее путь, но , к сожалению , у него есть какая - то ошибка и он не получил какие - либо обновлений , так как 2016 Других альтернатив , как представляются, с потерей мощности и прочности на разрыв . Во время написания этой статьи, у цепкости было больше звезд GItHub (2.3k против 1.2k), и она была обновлена совсем недавно, поэтому я решил использовать ее. Вот пример:
Приведенный выше код выводит что-то вроде:
Дополнительные настройки
tenacity.retry
перечислены на странице цепкости GitHub .источник
Если вам нужно решение без вложенных циклов и вызов
break
успеха, вы можете разработать быструюretriable
оболочку для любой итерации. Вот пример проблемы с сетью, с которой я часто сталкиваюсь - срок сохраненной аутентификации истекает. Использование этого будет выглядеть так:источник
Я использую следующие в моих кодах,
источник
источник
Вот мое мнение по этому вопросу. Следующая
retry
функция поддерживает следующие функции:Использование:
Смотрите мой пост для получения дополнительной информации.
источник
Вот моя идея, как это исправить:
источник
Я недавно работал с моим python над решением этой проблемы, и я рад поделиться им с посетителями stackoverflow, пожалуйста, дайте отзыв, если это необходимо.
источник
увеличивайте переменную цикла только тогда, когда предложение try успешно
источник