Как вернуться в цикл for после обработки исключений
Я готов запустить этот код, но прежде чем я хочу исправить обработку исключений:
for l in bios:
OpenThisLink = url + l
try:
response = urllib2.urlopen(OpenThisLink)
except urllib2.HTTPError:
pass
bio = response.read()
item = re.search('(JD)(.*?)(\d+)', bio)
....
Как было предложено здесь, я добавил try...except
, но теперь, если страница не открывается, я получаю эту ошибку:
bio = response.read()
NameError: name 'response' is not defined
Итак, программа продолжает выполняться. Вместо этого я хочу, чтобы он вернулся в цикл for и попробовал следующий URL-адрес. Я пробовал break
вместо pass
, но это заканчивает программу. Любые предложения?
Ответы
Ответ 1
Используйте continue
вместо break
.
Утверждение pass
является no-op (это означает, что он ничего не делает). Программа просто продолжает следующий оператор, поэтому вы получаете сообщение об ошибке.
break
выходит из циклов и продолжает работать из следующего оператора сразу после цикла. В этом случае больше нет инструкций, поэтому ваша программа завершается.
continue
перезапускает цикл, но со следующим элементом. Это именно то, что вы хотите.
Ответ 2
Попробуйте на самом деле намного мощнее, чем это. Вы также можете использовать блок else:
try:
stuff
except Exception:
print "oh no a exception"
else:
print "oh yay no exception"
finally:
print "leaving the try block"
Ответ 3
вы получаете эту ошибку, потому что, когда генерируется исключение, переменная ответа не существует. Если вы хотите оставить код, как у вас есть, вам нужно будет проверить, существует ли ответ, прежде чем вызывать чтение
if response:
bio = response.read()
...
сказав, что я согласен с Марк, что continue
является лучшим предложением, чем pass