Как вернуться в цикл for после обработки исключений - PullRequest
21 голосов
/ 04 декабря 2009

Я готов запустить этот код, но прежде чем я хочу исправить обработку исключений:

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, но это завершает программу. Есть предложения?

Ответы [ 3 ]

38 голосов
/ 04 декабря 2009

Используйте continue вместо break.

Утверждение pass является запретным (что означает, что оно ничего не делает) Программа просто переходит к следующему утверждению, поэтому вы получаете сообщение об ошибке.

break выходит из циклов и продолжает выполнение следующего оператора сразу после цикла. В этом случае больше нет операторов, поэтому ваша программа завершается.

continue перезапускает цикл, но со следующим элементом. Это именно то, что вы хотите.

12 голосов
/ 04 декабря 2009

Попытка на самом деле намного мощнее, чем это.Вы также можете использовать блок else здесь:

try:
    stuff
except Exception:
    print "oh no a exception"
else:
    print "oh yay no exception"
finally:
    print "leaving the try block"
1 голос
/ 04 декабря 2009

вы получаете эту ошибку, потому что когда выдается исключение, переменная ответа не существует. Если вы хотите оставить код таким, каким он есть, вам нужно проверить, существует ли ответ, прежде чем вызывать read

if response:
    bio = response.read()
    ...

сказав, что я согласен с Марком, что continue - лучшее предложение, чем pass

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...