2013-05-17 21 views
9

Ho una funzione Python denominata plot_pdf(f) che potrebbe generare un errore. Io uso una list comprehension per iterare su una lista di file su questa funzione:Gestione delle eccezioni Python nella comprensione degli elenchi

[plot_pdf(f) for f in file_list] 

voglio usare try-tranne blocco per saltare eventuali errori durante l'iterazione del ciclo e continuare con il file successivo. Quindi il seguente codice è il modo corretto per eseguire la gestione delle eccezioni nella comprensione degli elenchi Python?

try: 
    [plot_pdf(f) for f in file_list] # using list comprehensions 
except: 
    print ("Exception: ", sys.exc_info()[0]) 
    continue 

Il codice precedente termina l'iterazione corrente e passa alla successiva iterazione? Se non posso usare la lista di comprensione per catturare gli errori durante l'iterazione, quindi devo usare il normale ciclo for:

for f in file_list: 
    try: 
     plot_pdf(f) 
    except: 
     print("Exception: ", sys.exc_info()[0]) 
     continue 

Vorrei sapere se posso usare try-except per fare la gestione delle eccezioni nella lista di comprensione.

+5

"Io uso una list comprehension per iterare su una lista di file in questa funzione" * cough * * cough * ** ** COUGHCHOKERETCH –

+3

meno che non sono usando la lista prodotta dalla comprensione della lista, segui il ciclo for. – chepner

+0

Cosa c'è di sbagliato nel ciclo 'for'? –

risposta

12
try: 
    [plot_pdf(f) for f in file_list] # using list comprehensions 
except: 
    print ("Exception: ", sys.exc_info()[0]) 
    continue 

Se plot_pdf(f) getta un errore durante l'esecuzione di comprensione, poi, viene catturato nella clausola except, di valutazione non sarà altri elementi di comprensione.

Non è possibile gestire le eccezioni in una comprensione di lista, poiché la comprensione di una lista è un'espressione che contiene un'altra espressione, nient'altro (ad esempio, nessuna istruzione e solo istruzioni possono rilevare/ignorare/gestire eccezioni).

chiamate di funzione sono espressione, e gli organi di funzione possono includere tutti le dichiarazioni che si desidera, in modo da delegare la valutazione del sub-espressione eccezioni inclini a una funzione, come avete notato, è uno soluzione praticabile (altri, se fattibile, sono i controlli sui valori che potrebbero provocare eccezioni, come suggerito anche in altre risposte).

More here.

+0

Grazie. Questo mi aiuta a capire di più sulla comprensione della lista. – tonga

6

Sei bloccato con il tuo ciclo for a meno che non gestisci l'errore all'interno di plot_pdf o un wrapper.

def catch_plot_pdf(f): 
    try: 
     return plot_pdf(f) 
    except: 
     print("Exception: ", sys.exc_info()[0]) 

[catch_plot_pdf(f) for f in file_list] 
+0

Ho una certa gestione delle eccezioni all'interno di 'plot_pdf()'. Ma questo non cattura tutti gli errori. Quindi voglio usare la gestione delle eccezioni al di fuori della comprensione delle liste. Voglio solo sapere se il blocco try-except ha effetti sulla comprensione delle liste. In caso contrario, posso utilizzare solo il ciclo normale per rilevare, la maggior parte delle eccezioni. – tonga

+1

Quindi utilizzare un ciclo for regolare. –

1

Si potrebbe creare un catch oggetto

def catch(error, default, function, *args, **kwargs): 
    try: return function(*args, **kwargs) 
    except error: return default 

Poi si può fare

# using None as default value 
result (catch(Exception, None, plot_pdf, f) for f in file_list) 

E poi si può fare quello che vuoi con il risultato:

result = list(result) # turn it into a list 
# or 
result = [n for n in result if n is not None] # filter out the Nones 

Purtroppo questo non sarà nemmeno lontanamente velocità C, see my question here

Problemi correlati