#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