2013-09-25 15 views
8

Próbuję odczytać wszystkie pliki z folderu, który pasuje do określonych kryteriów. Mój program ulega awarii po podniesieniu wyjątku. Próbuję kontynuować, nawet jeśli istnieje wyjątek, ale nadal przestaje on działać.Sprawia, że ​​kod Pythona kontynuuje po wyjątku

To jest to, co otrzymuję po kilku sekundach.

error <type 'exceptions.IOError'> 

Oto mój kod

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

„Staram się kontynuować, nawet jeśli jest wyjątek” - nigdy tego zrobić, chyba że masz jasny plan, jak Twój program powinien być kontynuowany. Zakładając, że twój kod po bloku: except polega na zawartości pliku, kontynuowanie po błędzie IO jest złym pomysłem. Niech wyjątek spowoduje awarię programu, dzięki czemu można zauważyć i naprawić podstawowy problem. –

Odpowiedz

25

Wskaż swoją strukturę try/except bardziej w-oddziałach. W przeciwnym razie, gdy pojawi się błąd, przerwie wszystkie pętle.

Być może po pierwszej pętli for, dodaj try/except. Następnie, jeśli błąd zostanie zgłoszony, będzie kontynuowany z następnym plikiem.

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 

ten jest doskonałym przykładem tego, dlaczego należy użyć with oświadczenie tutaj, aby otworzyć pliki. Po otwarciu pliku przy użyciu open(), ale błąd zostanie przechwycony, plik pozostanie otwarty na zawsze. Teraz jest lepiej niż nigdy.

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 

Teraz jeśli błąd zostanie złapany, to plik zostanie zamknięty, a to, co robi zestawienie with.

2

Twój kod działa dokładnie tak, jak chcesz. Gdy otrzymasz wyjątek, przeskakuje on do tej sekcji:

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

Ponieważ nie ma nic po tym, program się kończy.

Również, że pass jest zbędny.

+0

Próbuję przekazać błąd i iść do przodu .. – Ank

+2

@Ankur 'pass' oznacza" nie rób nic ". Twój kod będzie kontynuowany bez tego. Problem polega na tym, że po twoim bloku 'except' nie ma nic do roboty. –

3

Przesuń klawisz try/except wewnątrz pętli for. Podobnie jak w:

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) 
Powiązane problemy