Python: продолжить цикл после исключения

У меня есть следующий скрипт (ниже). который вернет код состояния URL. Он перебирает файл и пытается подключиться к каждому хосту. Единственная проблема заключается в том, что он, очевидно, прекращает цикл, когда достигает исключения.

Я пробовал множество вещей, чтобы поставить как это в цикле, но безрезультатно. Какие-нибудь мысли?

import urllib
import sys
import time

hostsFile = "webHosts.txt"


try:
    f = file(hostsFile)
    while True:
        line = f.readline().strip()
        epoch = time.time()
        epoch = str(epoch)
        if len(line) == 0:
            break
        conn = urllib.urlopen(line)
        print epoch + ": Connection successful, status code for " + line + " is " + str(conn.code) + "\n"
except IOError:
    epoch = time.time()
    epoch = str(epoch)
    print epoch + ": Connection unsuccessful, unable to connect to server, potential routing issues\n"
    sys.exit()
else:
    f.close()

РЕДАКТИРОВАТЬ:

Тем временем я придумал это, есть какие-то проблемы с этим? (я все еще учусь: р) ...

f = file(hostsFile)
while True:
    line = f.readline().strip()
    epoch = time.time()
    epoch = str(epoch)
    if len(line) == 0:
        break
    try:
        conn = urllib.urlopen(line)
        print epoch + ": Connection successful, status code for " + line + " is " + str(conn.code) + "\n"
    except IOError:
        print epoch + "connection unsuccessful"

Спасибо,

MHibbin

 Alex Wilson03 июл. 2012 г., 10:17
Вы пытались перехватить исключение, используя блок try ... кроме, а затем предупреждение и продолжение?
 MHibbin03 июл. 2012 г., 10:20
@ Алекс Уилсон, у меня была еще одна тренировка ... и я изменил свой вопрос ... ты это имел ввиду?
 Alex Wilson03 июл. 2012 г., 10:31
Это точно. Красиво сделано ...

Ответы на вопрос(3)

Решение Вопроса

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

with open(hostsFile, 'r') as f:
    for line in f:
        line = line.strip()
        if not line:
            continue

        epoch = str(time.time())

        try:
            conn = urllib.urlopen(line)
            print epoch + ": Connection successful, status code for " + line + " is " + str(conn.code) + "\n"
        except IOError:
            print epoch + ": Connection unsuccessful, unable to connect to server, potential routing issues\n"
 03 июл. 2012 г., 10:29
for line in f вероятно, здесь лучше, чем цикл while.
 MHibbin03 июл. 2012 г., 15:25
@ H.Dunlop, спасибо. У меня есть список из примерно 100 URL для тестирования (для подключения к внутренней сети (это устройства с webUI). Мы хотели бы проверять их каждые 60 секунд. Можно ли ускорить этот процесс ... могу ли я использовать этот скрипт для генерации небольшого скрипта для каждого хоста (или это плохо сказывается на производительности)
 03 июл. 2012 г., 10:36
@ЧАС. Dunlop:if line: или жеif not line: continue
 MHibbin03 июл. 2012 г., 10:24
Я пришел к такому же выводу сразу после того, как отправил вопрос. :-) Спасибо за подтверждение того, что я сделал.
 03 июл. 2012 г., 10:34
Абсолютно, и если вы проверяете каждую строку на наличие пустой строки (line == & apos; & apos; :) перед удалением новой строки (\ n), то вы можете обрабатывать пустые строки в исходном файле, не выходя преждевременно.

Вы должны обработать исключение, вызванноеurllib.urlopen(line), что-то вроде этого.

try:
    f = file(hostsFile)
    while True:
        line = f.readline().strip()
        epoch = time.time()
        epoch = str(epoch)
        if len(line) == 0:
            break
        try:
           conn = urllib.urlopen(line)
        except IOError:
           print "Exception occured"
           pass
except IOError:
    epoch = time.time()
    epoch = str(epoch)
    print epoch + ": Connection unsuccessful, unable to connect to server, potential routing issues\n"
    sys.exit()
else:
    f.close()
 MHibbin03 июл. 2012 г., 10:22
Спасибо за ответ. Я отредактировал свой вопрос с возможным решением, которое я нашел за это время.

Вы можете попробовать перехватить исключение внутри цикла while как-то так.

try:
    f = file(hostsFile)
    while True:
        line = f.readline().strip()
        epoch = time.time()
        epoch = str(epoch)
        if len(line) == 0:
            break
        try:
            conn = urllib.urlopen(line)
            print epoch + ": Connection successful, status code for " + line + " is " + str(conn.code) + "\n"
        except:
            epoch = time.time()
            epoch = str(epoch)
            print epoch + ": Connection unsuccessful, unable to connect to server, potential routing issues\n"
except IOError:
    pass
else:
    f.close()

Ваш ответ на вопрос