Как вернуться в цикл for после обработки исключений

20

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

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

    
задан Zeynel 03.12.2009 в 23:59
источник

3 ответа

34

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

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

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

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

    
ответ дан Mark Byers 04.12.2009 в 00:01
  • После того, как обработано исключение, он возвращается туда, где он был пойман, как и большинство бродяг. –  jathanism 04.12.2009 в 00:11
  • спасибо. продолжить работает отлично. –  Zeynel 04.12.2009 в 00:36
  • @jathanism: нет, это не так. Если вы не поднимаете его снова или что-то еще, он продолжает выполнение после блока except. –  drevicko 19.12.2012 в 03:36
10

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

try:
    stuff
except Exception:
    print "oh no a exception"
else:
    print "oh yay no exception"
finally:
    print "leaving the try block"
    
ответ дан Jochen Ritzel 04.12.2009 в 00:34
  • Это правильная обработка исключений, которая привела меня к моему решению. Благодаря! –  Rockbar 28.02.2018 в 17:15
1

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

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

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

    
ответ дан John Stallings 04.12.2009 в 02:27