2010-08-01 8 views
7

ich eine Datei aus dem Netz herunterlade, und es versagt, obwohl ich tue:, wie Fehler zu protokollieren Datei, und nicht auf Ausnahme scheitern

für p in Abfrage:

try: 

except IOError as e: 
    print e; 

Wenn Es gibt einen Fehler, ich möchte ihn protokollieren und fahre dann mit der nächsten Datei fort.

In dieser Schleife versuche ich ein Bild herunterzuladen, wenn aus irgendeinem Grund der Dateiname schlecht war, oder die Webseite nicht erreichbar war, etc., ich möchte mit dem nächsten Element in der for-Schleife fortfahren.

Gibt es einen allgemeineren Fehler, der nicht fehlschlägt und die Verarbeitung fortsetzt?

Wie kann ich auch Fehler in einer Datei protokollieren?

+0

Sobald der Fehler auftritt, können Sie nicht fortfahren - der Download ist kaputt. Welchen spezifischen Fehler bekommst du? –

+0

Ich habe dies in einer for-Schleife, warum kann ich den Fehler nicht abfangen, dann weiter und versuchen Sie die nächste Datei? – Blankman

+0

@Blankman: Da Sie keinen Code zur Verfügung gestellt haben, ist es unmöglich zu erraten, warum Sie den Fehler nicht "abfangen können, dann fahren Sie fort und versuchen Sie die nächste Datei". –

Antwort

6

Wie bereits von Lott aus, wenn ein Download fehlschlägt, es sei denn, die Problem ist upstream (oder mit Ihrer Download-Adresse) behoben, das Beste, was Sie tun können, ist es erneut zu versuchen. Wenn jedoch die Situation ist, dass Sie eine Liste von Downloads haben, und wollen einfach nur über überspringen Fehlgeschlagene Downloads statt Verlassen dann:

logf = open("download.log", "w") 
for download in download_list: 
    try: 
     # code to process download here 
    except Exception as e:  # most generic exception you can catch 
     logf.write("Failed to download {0}: {1}\n".format(str(download), str(e))) 
     # optional: delete local version of failed download 
    finally: 
     # optional clean up code 
     pass 

Dinge zu beachten:

(1) Die Nutzung des " logging "Modul, wie von ~ unutbu vorgeschlagen, gibt Ihnen viel mehr Flexibilität und Kraft mit Ihrer Logging-Ausgabe, einschließlich Zeitstempel, gleichzeitig auf verschiedenen Kanälen (zB stderr, Datei) je nach Fehler Ebenen, etc. etc.

(2) Sie könnten die obige Logik mit dem Konstrukt "with" implementieren.

+0

Was Logf ist, kann es nirgendwo finden, wenn man in Google nach 'Python Logf' sucht. – Blankman

+0

ah, es ist nur eine Variable dachte, es war mit der Protokollierung tut mir leid. – Blankman

6

könnten Sie die logging module:

import logging 
logging.basicConfig(filename='/tmp/myapp.log', level=logging.DEBUG, 
        format='%(asctime)s %(levelname)s %(name)s %(message)s') 
logger=logging.getLogger(__name__) 

try: 
    1/0 
except ZeroDivisionError as err: 
    logger.error(err) 

das Skript ausführen schreibt in /tmp/myapp.log:

% cat /tmp/myapp.log 
2010-08-01 17:50:45,960 ERROR __main__ integer division or modulo by zero 
+1

Schön. Aber der Download ist immer noch kaputt. Das wird es nicht magisch "machen" und "weitermachen". –

2

Das fängt alles ein. Aber es ist viel, viel besser, die genaue Ausnahme zu fangen. Python < = 2,7

while True 
    try: 
    doStuff() 
    except Exception, e: 
    f = open('log.txt', 'w') 
    f.write('An exceptional thing happed - %s' % e) 
    f.close() 
0

Dieser Ihre Fehler in eine Log-Datei schreiben und weiterhin um den Code auszuführen.

Verwandte Themen