2013-09-25 32 views
8

Sto provando a leggere tutti i file da una cartella che corrisponde a un determinato criterio. Il mio programma si arresta in modo anomalo una volta sollevata un'eccezione. Sto cercando di continuare anche se c'è un'eccezione, ma continua a essere in esecuzione.Il codice python continua dopo l'eccezione

Questo è ciò che ottengo dopo un paio di secondi.

error <type 'exceptions.IOError'> 

Ecco il mio codice

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

"Sto cercando di continuare, anche se c'è una deroga" - mai fare questo a meno che non si dispone di un piano chiaro per il modo in cui il programma deve continuare. Supponendo che il tuo codice dopo il blocco tranne: si basa sul contenuto del file, continuando dopo un errore di I/O è una cattiva idea. Lascia che l'eccezione blocchi il programma, in modo che tu possa effettivamente notare e risolvere il problema sottostante. –

risposta

25

Metti la tua struttura try/except più in reparti. Altrimenti, quando si verifica un errore, si romperanno tutti i loop.

Forse dopo il primo ciclo, aggiungere try/except. Quindi, se viene generato un errore, continuerà con il file successivo.

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 

Questo è un perfetto esempio del perché si dovrebbe utilizzare un'istruzione with qui per aprire i file. Quando apri il file utilizzando open(), ma viene rilevato un errore, il file rimarrà aperto per sempre. Ora è meglio che mai.

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 

Ora, se un errore viene catturato, il file sarà chiuso, come questo è ciò che la dichiarazione with fa.

2

Il codice sta facendo esattamente quello che stai dicendo di fare. Quando si ottiene un'eccezione, salta giù a questa sezione:

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

Dal momento che non c'è niente dopo che, il programma termina.

Inoltre, che pass è superfluo.

+0

Sto cercando di passare l'errore e andare avanti .. – Ank

+2

@'Ankur 'pass' significa" non fare nulla ". Il tuo codice continuerà senza di esso. Il problema è che non c'è niente da fare dopo il tuo blocco "tranne". –

3

Sposta il try/tranne all'interno del ciclo for. Come 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) 
Problemi correlati