Как перехватить исключение в цикле for и вернуть исключение только после завершения цикла?

#python #python-3.x

#python #python-3.x

Вопрос:

Привет, у меня есть функция, которая анализирует первые 60 строк в файле и должна предупреждать пользователя, если есть строки, которые полностью заполнены пробелами. Однако это может произойти где угодно в этих 60 строках, поэтому я хочу, чтобы скрипт анализировал все 60 строк, главным образом потому, что мне нужны данные из нескольких строк для моего отчета об ошибках. И мы могли бы захотеть знать, где эти ошибки возникнут в будущем. Я написал это:

 def header_data(data):
    dictionary = {}
    datalen = len(data)
    itrcntr = 0
    try:
        for line in data:
            itrcntr  = 1
            if line.isspace():
                raise Exception('File has badly formatted header data line(s)')
            else:
                linesplit = line.rstrip().split(":")
                if len(linesplit) > 1:
                    dictionary[linesplit[0]] = linesplit[1].strip()
        return dictionary 
    except Exception as e:
        errmsg = str(e)
        if itrcntr == datalen:
            return (dictionary, errmsg)
        else:
            pass
  
  

С помощью этой функции я ожидаю, что если она увидит, что значение itrcntr не равно datalen , она пройдет и вернется к блоку try и перейдет к следующей строке. Но этого не происходит. Вместо этого он выходит из функции и продолжается в следующей строке в вызывающей функции. Как я могу заставить его продолжать цикл, пока он не дойдет до конца цикла, в котором он затем вернет словарь вместе с сообщением об ошибке? Или это нельзя сделать с помощью обработчиков исключений try catch?

Комментарии:

1. Вы фиксируете исключение вне цикла. Это else: pass не операция. Я думаю, что ваш дизайн ошибочен, что, вероятно, является основной причиной вашего вопроса, но это обсуждение на другой день. Ответ @little_birdie довольно хорош, если предположить, что вы собираетесь сохранить свой ошибочный дизайн.

Ответ №1:

Если вы не хотите перехватывать исключения, отличные от ситуации line.isspace , я бы try вообще не использовал блок. Просто соберите свои ошибки в список, например:

 errors = []
for line in data:
    itrcntr  = 1
    if line.isspace():
        errors.append('File has badly formatted header data at line %d.' % itrcntr)

# then at the end:
if errors:
    # do something about it...
  

Комментарии:

1. Спасибо за отзыв и ответ кстати

2. Пожалуйста. Как объяснялось другими, когда возникает исключение, оно приведет вас прямо с этой точки до конца включающего блока try . Весь код в блоке try после точки, в которой возникает исключение, эффективно пропускается. Если вы находитесь в цикле, а блок try находится вне цикла, цикл будет прерван. Если у вас есть цикл, в котором что-то может пойти не так с одной итерацией, но вы хотите продолжить на следующей итерации, вы бы поместили свой блок try внутри цикла. Но это не имеет смысла в данной текущей ситуации.

Ответ №2:

Если возникло какое-либо исключение, предложение try будет пропущено, и предложение except будет выполнено.

Если вы создадите исключение в любом месте попытки, все остальное будет пропущено. Поэтому, если вы хотите, чтобы цикл продолжался, просто не используйте Try Except .

Просто соберите каждое сообщение об ошибке, а затем верните его.

Комментарии:

1. Но разве команда «передать» в конце не указывает, что она должна перейти к следующей строке?

2. @edo101 да, перейдите к следующей строке за пределами блока try