Продолжить цикл если ошибка python

Put your try/except structure more in-wards. Otherwise when you get an error, it will break all the loops.

Perhaps after the first for-loop, add the try/except. Then if an error is raised, it will continue with the next file.

for infile in listing:
    try:
        if infile.startswith("ABC"):
            fo = open(infile,"r")
            for line in fo:
                if line.startswith("REVIEW"):
                    print infile
            fo.close()
    except:
        pass

This is a perfect example of why you should use a with statement here to open files. When you open the file using open(), but an error is catched, the file will remain open forever. Now is better than never.

for infile in listing:
    try:
        if infile.startswith("ABC"):
            with open(infile,"r") as fo
                for line in fo:
                    if line.startswith("REVIEW"):
                        print infile
    except:
        pass

Now if an error is caught, the file will be closed, as that is what the with statement does.

Decorator is a good approach.

from functools import wraps
import time

class retry:
    def __init__(self, success=lambda r:True, times=3, delay=1, raiseexception=True, echo=True):
        self.success = success
        self.times = times
        self.raiseexception = raiseexception
        self.echo = echo
        self.delay = delay
    def retry(fun, *args, success=lambda r:True, times=3, delay=1, raiseexception=True, echo=True, **kwargs):
        ex = Exception(f"{fun} failed.")
        r = None
        for i in range(times):
            if i > 0:
                time.sleep(delay*2**(i-1))
            try:
                r = fun(*args, **kwargs)
                s = success(r)
            except Exception as e:
                s = False
                ex = e
                # raise e
            if not s:
                continue
            return r
        else:
            if echo:
                print(f"{fun} failed.", "args:", args, kwargs, "nresult: %s"%r)
            if raiseexception:
                raise ex
    def __call__(self, fun):
        @wraps(fun)
        def wraper(*args, retry=0, **kwargs):
            retry = retry if retry>0 else self.times
            return self.__class__.retry(fun, *args, 
                                        success=self.success, 
                                        times=retry,
                                        delay=self.delay,
                                        raiseexception = self.raiseexception,
                                        echo = self.echo,
                                        **kwargs)
        return wraper

some usage examples:

@retry(success=lambda x:x>3, times=4, delay=0.1)
def rf1(x=[]):
    x.append(1)
    print(x)
    return len(x)
> rf1()

[1]
[1, 1]
[1, 1, 1]
[1, 1, 1, 1]

4
@retry(success=lambda x:x>3, times=4, delay=0.1)
def rf2(l=[], v=1):
    l.append(v)
    print(l)
    assert len(l)>4
    return len(l)
> rf2(v=2, retry=10) #overwite times=4

[2]
[2, 2]
[2, 2, 2]
[2, 2, 2, 2]
[2, 2, 2, 2, 2]

5
> retry.retry(lambda a,b:a+b, 1, 2, times=2)

3
> retry.retry(lambda a,b:a+b, 1, "2", times=2)

TypeError: unsupported operand type(s) for +: 'int' and 'str'

Нужно, чтобы при любой ошибке в любой из функций — выждать 5 сек и продолжить выполнение, не переходя на следующий цикл, с тем же ftid.
Сейчас, в случае ошибки, будет пропуск отработки функций с этим ftid.
Как сделать максимально правильно.

for ftid in range(begin_ftid, end_ftid):
        try:
           f1(ftid)
           f2(ftid)
           f3(ftid)
              
        except Exception:
            time.sleep(5)
            pass


  • Вопрос задан

    более двух лет назад

  • 467 просмотров

for ftid in range(begin_ftid, end_ftid):
    while True:
        try:
            f1(ftid)
            f2(ftid)
            f3(ftid)

        except Exception:
            time.sleep(5)
            continue
        break

Пригласить эксперта

Оберунуть каждую функцию в try … except, либо внутри самих функций добавить то же самое

Я бы сделал так: программа работает пока очередь не пуста, в очередь складываются обьекты со следующими параметрами

I’d
Retrycount
Delay
Status

Если что пошло не так то в обработчике эксепшена ставится статус ошибки и уменьшается количество попыток. Ну и ставиться время через которое попробовать. Цикл бесконечный, но с условием выхода по окончании очереди или при 0 количестве повторов. Дополнительно можно добавить на каждую попытку сообщение об ошибке и при выходе отображать их.


  • Показать ещё
    Загружается…

07 июн. 2023, в 13:10

90000 руб./за проект

07 июн. 2023, в 13:07

500 руб./за проект

07 июн. 2023, в 13:02

12000 руб./за проект

Минуточку внимания

  • Главная

  • Инструкции

  • Python

  • Операторы break, continue и pass в циклах Python 3

При работе с циклами while и for бывает необходимо выполнить принудительный выход, пропустить часть или игнорировать заданные условия. Для первых двух случаев используются операторы break и continue Python, а для игнорирования условий — инструкция pass. Давайте посмотрим на примерах, как работают эти операторы.

Инструкция break в языке программирования Python прерывает выполнение блока кода. Простейший пример:

for j in 'bananafishbones':
    if j == 'f':
        break
    print(j)

Получаем такой вывод:

b
a
n
a
n
a

Как только программа после нескольких итераций доходит до элемента последовательности, обозначенного буквой f, цикл (loop) прерывается, поскольку действует оператор break. Теперь рассмотрим работу этой инструкции в цикле while:

x = 0
while x < 5:
    print(x)
    x += 0.5
print('Выход')

Вывод будет следующий (приводим с сокращениями):

0
0.5

4.0
4.5
Выход

Как только перестает выполняться условие и x становится равным 5, программа завершает цикл. А теперь перепишем код с использованием инструкции break:

x = 0
while True:
    print(x)
    if x >= 4.5:
        break
    x += 0.5
print('Выход')

Результат тот же:

0
0.5

4.0
4.5
Выход

Мы точно так же присвоили x значение 0 и задали условие: пока значение x истинно (True), продолжать выводить его. Код, правда, получился немного длиннее, но бывают ситуации, когда использование оператора прерывания оправданно: например, при сложных условиях или для того, чтобы подстраховаться от создания бесконечного цикла. Уберите из кода выше две строчки:

x = 0
while True:
    print(x)
    x += 0.5
print('Выход')

И перед нами бесконечный вывод:

0
0.5

100
100.5

1000000
1000000.5

И слово в конце (‘Выход’), таким образом, никогда не будет выведено, поскольку цикл не закончится. Поэтому при работе с последовательностями чисел использование оператора break убережет вас от сбоев в работе программ, вызываемых попаданием в бесконечный цикл.

Конструкция с else

Иногда необходимо проверить, был ли цикл исполнен до конца или выход произошел с использованием инструкции break. Для этого добавляется проверка по условию с else. Напишем программу, которая проверяет фразу на наличие запрещенных элементов:

word = input('Введите слово: ')
for i in word:
    if i == 'я':
        print('Цикл был прерван, обнаружена буква я')
        break
else:
    print('Успешное завершение, запрещенных букв не обнаружено')
print('Проверка завершена')

Теперь, если пользователь введет, например, «Привет!», программа выдаст следующее:

Успешное завершение, запрещенных букв не обнаружено
Проверка завершена

Но если во введенном слове будет буква «я», то вывод примет такой вид:

Цикл был прерван, обнаружена буква я
Проверка завершена

Небольшое пояснение: функция input принимает значение из пользовательского ввода (выражение 'Введите слово: ' необходимо только для пользователя, для корректной программы хватило бы и такой строки: word = input ()) и присваивает его переменной word. Последняя при помощи for поэлементно (в данном случае — побуквенно) анализируется с учетом условия, вводимого if.

Оператор continue в Python

Если break дает команду на прерывание, то continue действует более гибко. Его функция заключается в пропуске определенных элементов последовательности, но без завершения цикла. Давайте напишем программу, которая «не любит» букву «я»:

word = input('Введите слово: ')
for i in word:
    if i == 'я':
        continue
    print(i)

Попробуйте ввести, например, «яблоко», в этом случае вывод будет таким:

б
л
о
к
о

Это происходит потому, что мы задали условие, по которому элемент с определенным значением (в данном случае буква «я») не выводится на экран, но благодаря тому, что мы используем инструкцию continue, цикл доходит до последней итерации и все «разрешенные» элементы выводятся на экран. Но в коде выше есть одна проблема: если пользователь введет, например, «Яблоко», программа выведет слово полностью, поскольку не учтен регистр:

Я
б
л
о
к
о

Наиболее очевидное решение в данном случае состоит в добавлении и заглавной буквы в блок if таким образом:

word = input('Введите слово: ')
for i in word:
    if i == 'я' or i == 'Я':
        continue
    print(i)

Оператор pass в Python

Назначение pass — продолжение цикла независимо от наличия внешних условий. В готовом коде pass встречается нечасто, но полезен в процессе разработки и применяется в качестве «заглушки» там, где код еще не написан. Например, нам нужно не забыть добавить условие с буквой «я» из примера выше, но сам этот блок по какой-то причине мы пока не написали. Здесь для корректной работы программы и поможет заглушка pass:

word = input('Введите слово: ')
for i in word:
    if i == 'я':
        pass
else:
    print('Цикл завершен, запрещенных букв не обнаружено')
print('Проверка завершена')

Теперь программа запустится, а pass будет для нас маркером и сообщит о том, что здесь нужно не забыть добавить условие.

Вот и всё, надеемся, скоро break, continue и pass станут вашими верными друзьями в разработке интересных приложений. Успехов! 

  • Оператор Python continue используется для пропуска выполнения текущей итерации цикла.
  • Мы не можем использовать его вне цикла, он выдаст ошибку как «SyntaxError: ‘continue’ external loop».
  • Мы можем использовать его с циклами for и while.
  • Присутствует во вложенном цикле, он пропускает выполнение только внутреннего цикла.
  • «Continue» — зарезервированное ключевое слово в Python.
  • Как правило, оператор continue используется с оператором if, чтобы определить условие пропуска текущего выполнения цикла.

Блок-схема оператора continue

Синтаксис оператора

Синтаксис оператора continue:

continue

Мы не можем использовать какие-либо опции, метки или условия.

Примеры

Давайте посмотрим на несколько примеров использования оператора continue в Python.

1. Как продолжить цикл for?

Допустим, у нас есть последовательность целых чисел. Мы должны пропустить обработку, если значение равно 3. Мы можем реализовать этот сценарий, используя цикл for и оператор continue.

t_ints = (1, 2, 3, 4, 5)

for i in t_ints:
    if i == 3:
        continue
    print(f'Processing integer {i}')

print("Done")

Вывод:

продолжение цикла for

2. Совместно с циклом while

Вот простой пример использования оператора continue с циклом while.

count = 10

while count > 0:
    if count % 3 == 0:
        count -= 1
        continue
    print(f'Processing Number {count}')
    count -= 1

Вывод:

пример с циклом while

3. Пример с вложенным циклом

Допустим, у нас есть список кортежей для обработки. Кортеж содержит целые числа. Обработку следует пропустить при следующих условиях.

  • пропустить обработку кортежа, если его размер больше 2.
  • пропустить выполнение, если целое число равно 3.

Мы можем реализовать эту логику с помощью вложенных циклов for. Нам нужно будет использовать два оператора continue для выполнения вышеуказанных условий.

list_of_tuples = [(1, 2), (3, 4), (5, 6, 7)]

for t in list_of_tuples:
    # don't process tuple with more than 2 elements
    if len(t) > 2:
        continue
    for i in t:
        # don't process if the tuple element value is 3
        if i == 3:
            continue
        print(f'Processing {i}')

Вывод:

пример с вложенным циклом

Многие популярные языки программирования поддерживают помеченный оператор continue. В основном он используется для пропуска итерации внешнего цикла в случае вложенных циклов. Однако Python не поддерживает помеченный оператор continue.

PEP 3136 был сделан, чтобы добавить поддержку метки для оператора continue. Но он был отклонен, потому что это очень редкий сценарий, который добавит ненужной сложности языку. Мы всегда можем написать условие во внешнем цикле, чтобы пропустить текущее выполнение.

Оператор break

  • Оператор break в Python используется для выхода из текущего цикла.
  • Мы не можем использовать оператор break вне цикла, он выдаст ошибку как «SyntaxError: ‘break’ external loop».
  • Мы можем использовать его с циклами for и while.
  • Если оператор break присутствует во вложенном цикле, он завершает внутренний цикл.
  • «Break» — зарезервированное ключевое слово в Python.

Блок-схема оператора break

схема работы оператора Break

Синтаксис оператора break

Синтаксис оператора break:

break

Мы не можем использовать какие-либо опции, метки или условия.

Примеры

1. оператор break с циклом for

Допустим, у нас есть последовательность целых чисел. Мы должны обрабатывать элементы последовательности один за другим. Если мы встречаем «3», то обработка должна быть остановлена. Мы можем использовать цикл for для итерации и оператор break с условием if, чтобы реализовать это.

t_ints = (1, 2, 3, 4, 5)

for i in t_ints:
    if i == 3:
        break
    print(f'Processing {i}')

print("Done")

Вывод:

break с циклом for

2. Оператор break с циклом while

count = 10

while count > 0:
    print(count)
    if count == 5:
        break
    count -= 1

Вывод:

Оператор break с циклом while

3. С вложенным циклом

Вот пример оператора break во вложенном цикле.

list_of_tuples = [(1, 2), (3, 4), (5, 6)]

for t in list_of_tuples:
    for i in t:
        if i == 3:
            break
        print(f'Processing {i}')

Вывод:

пример с вложенным циклом

Однако Python не поддерживает помеченный оператор break. Он был убран, потому что это добавит ненужной сложности языку. Для этого сценария есть лучшая альтернатива — переместите код в функцию и добавьте оператор return.

Понравилась статья? Поделить с друзьями:
  • Причины ошибок при определении группы крови
  • Продолжить установку невозможно произошла ошибка nvidia geforce experience
  • Приставка ростелеком ошибка нет ip адреса
  • Продолжительные кредиты речевая ошибка
  • Приора ошибка с001