Подтвердить что ты не робот

Как вернуться в цикл 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, но это заканчивает программу. Любые предложения?

4b9b3361

Ответ 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