2013-09-25 3 views
8

Ich versuche, alle Dateien aus einem Ordner zu lesen, die bestimmte Kriterien erfüllt. Mein Programm stürzt ab, sobald eine Ausnahme ausgelöst wird. Ich versuche fortzufahren, auch wenn es eine Ausnahme gibt, aber es hört immer noch auf auszuführen.Machen Sie Python-Code weiter nach Ausnahme

Das ist, was ich nach ein paar Sekunden bekomme.

error <type 'exceptions.IOError'> 

Hier ist mein Code

import os 
path = 'Y:\\Files\\' 
listing = os.listdir(path) 
try: 
    for infile in listing: 
     if infile.startswith("ABC"): 
      fo = open(infile,"r") 
      for line in fo: 
       if line.startswith("REVIEW"): 
        print infile 
      fo.close() 
except: 
    print "error "+str(IOError) 
    pass 
+0

„Ich versuche auch weiterhin, wenn es eine Ausnahme“ - dies nie tun, wenn Sie einen klaren Plan dafür haben, wie Ihr Programm soll fortgesetzt werden. Wenn Sie davon ausgehen, dass Ihr Code nach dem Block "except:" auf den Inhalt der Datei angewiesen ist, ist es nach einem E/A-Fehler weiterhin eine schlechte Idee. Lassen Sie stattdessen die Ausnahme das Programm abstürzen, so dass Sie das zugrunde liegende Problem tatsächlich bemerken und beheben können. –

Antwort

25

Setzen Sie Ihre try/except Struktur mehr in-Stationen. Andernfalls, wenn Sie einen Fehler erhalten, wird es alle Schleifen brechen.

Vielleicht nach der ersten for-Schleife, fügen Sie die try/except hinzu. Wenn dann ein Fehler auftritt, wird mit der nächsten Datei fortgefahren.

for infile in listing: 
    try: 
     if infile.startswith("ABC"): 
      fo = open(infile,"r") 
      for line in fo: 
       if line.startswith("REVIEW"): 
        print infile 
      fo.close() 
    except: 
     pass 

Dies ist ein perfektes Beispiel dafür, warum Sie hier eine with Anweisung verwenden sollten Dateien zu öffnen. Wenn Sie die Datei mit open() öffnen, aber ein Fehler festgestellt wird, bleibt die Datei für immer geöffnet. Jetzt ist besser als nie.

for infile in listing: 
    try: 
     if infile.startswith("ABC"): 
      with open(infile,"r") as fo 
       for line in fo: 
        if line.startswith("REVIEW"): 
         print infile 
    except: 
     pass 

Nun, wenn ein Fehler erfasst wird, wird die Datei geschlossen werden, wie das, was die with Aussage tut, ist.

2

Ihr Code macht genau das, was Sie ihm vorschreiben. Wenn Sie eine Ausnahme erhalten, springt er auf diesen Abschnitt nach unten:

except: 
    print "error "+str(IOError) 
    pass 

Da es danach nichts ist, endet das Programm.

Auch das pass ist überflüssig.

+0

Ich versuche, den Fehler zu übergeben und voranzukommen .. – Ank

+2

@Ankur 'pass' bedeutet" nichts tun ". Ihr Code wird ohne es fortgesetzt. Das Problem ist, dass es nach dem 'except' Block nichts mehr zu tun gibt. –

3

Verschieben Sie den try/except innerhalb der for-Schleife. Wie in:

import os 
    path = 'C:\\' 
    listing = os.listdir(path) 
    for infile in listing: 
     try:  
      if infile.startswith("ABC"): 
       fo = open(infile,"r") 
       for line in fo: 
        if line.startswith("REVIEW"): 
         print infile 
       fo.close() 
     except: 
       print "error "+str(IOError) 
Verwandte Themen