Задать вопрос

Как НЕ переходить к следующему элементу цикла при raise exception?

Добрый день. Есть следующий код

for string in file:

            try:
                # что-то делаем

            except (Exception) as e:

                # обрабатываем исключение


после обработки исключения, итерация переходит к следующему элементу. Подскажите, как сделать так, чтобы после обработки исключения итератор не сдвигался и была возможность повторно обработать необработанный шаг?
  • Вопрос задан
  • 235 просмотров
Подписаться 1 Простой 10 комментариев
Решения вопроса 2
netpastor
@netpastor
Python developer
Вынеси весь код обработки в функцию и там обрабатывай
def proccess(line):
    while True:
        try:
            # do something
            return result
        except:
            # do something
            if max_retries: # условие выхода
                return error

for string in file:
    result = proccess(string)
    ...
Ответ написан
Комментировать
@o5a
for string in file:
    while True:
        try:
            # что-то делаем
            break
        except (Exception) as e:
            # обрабатываем исключение

Если подразумевается, что каждый try будет делать что-то новое, приближаясь к цели.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@immelnikoff
Изучаю БД
Явно не самая изящная идея (рекурсивная функция), но может поможет:
def processing_bstring(bstring, attemps=[]):
    try:
        bstring.decode('ascii')
        print('Первые', len(bstring),'символов лежат в пространстве ASCII!:', bstring)
        print('Номер попытки:', len(attemps) + 1)
        print('История неудач:', attemps)
    except UnicodeDecodeError:
        if len(attemps) < 10:   #ограничиваем число попыток
            attemps.append('Не ASCII-строка!') #добавляем причину неудачи в историю неудач
            processing_bstring(bstring[:-1], attemps) #откидываем от строки последний байт и вызываем заново
        else:
            print('Исчерпаны все попытки обработки строки!')

my_bytes = 'qwz123ё'.encode()
processing_bstring(my_bytes)
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы