2012-07-03 8 views
9

Ich habe das folgende Skript (unten). Das gibt den Statuscode von URLs zurück. Es durchläuft eine Datei und versucht, sich mit jedem Host zu verbinden. Das einzige Problem ist, dass es offensichtlich stoppt, wenn es eine Ausnahme erreicht.Python: Schleife weiter nach Ausnahme

Ich habe zahlreiche Dinge ausprobiert, um das Wie in einer Schleife zu setzen, aber ohne Erfolg. Irgendwelche Gedanken?

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() 

EDIT:

Ich habe mit diesem in der mittleren Zeit, keine Probleme mit diesem kommen? (Ich lerne immer noch: p) ...

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" 

Danke,

MHibbin

+1

Haben Sie versucht, die Ausnahme abfangen einen Versuch mit ... except-Block, und so wird die Warnung und Weiterbildung? –

+0

@Alex Wilson, ich hatte ein anderes Spiel herum ... und änderte meine Frage ... ist das was du meintest? – MHibbin

+1

Es ist in der Tat. Schön gemacht ... –

Antwort

11

Sie könnten die Ausnahme behandeln, wo sie ausgelöst wird. Verwenden Sie beim Öffnen von Dateien auch einen Kontextmanager, um den Code zu vereinfachen.

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" 
+0

Ich kam zu dem gleichen Schluss, nachdem ich die Frage gestellt hatte. :-) Danke für die Bestätigung, was ich getan habe. – MHibbin

+3

'für Linie in f 'ist wahrscheinlich hier besser als eine While-Schleife. – georg

+0

Absolut, und wenn Sie jede Zeile mit der leeren Zeichenfolge (Zeile == '' :) vor dem Entfernen der Zeilenumbrüche (\ n) testen, können Sie Leerzeilen in der Quelldatei behandeln, ohne vorzeitig zu beenden. – aychedee

4

Sie benötigen Ausnahme von urllib.urlopen(line), so etwas wie dies angehoben zu handhaben.

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() 
+0

Danke für die Antwort. Ich habe meine Frage mit einer möglichen Lösung bearbeitet, die ich in der Zwischenzeit gefunden habe. – MHibbin

0

Sie könnten versuchen, die Ausnahme innerhalb der While-Schleife als etwas ähnliches zu fangen.

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() 
Verwandte Themen