2013-05-17 2 views
9

Ich habe eine Python-Funktion namens plot_pdf(f), die einen Fehler auslösen könnte. Ich benutze eine Liste Verständnis eine Liste von Dateien auf diese Funktion iterieren:Python-Ausnahmebehandlung im Listenverständnis

[plot_pdf(f) for f in file_list] 

Ich versuche-except-Block verwenden möchten mögliche Fehler bei der Iterationsschleife zu überspringen und mit der nächsten Datei fortgesetzt werden. Also ist der folgende Code korrekt, um die Ausnahmebehandlung im Python-Listenverständnis zu machen?

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

Wird der obige Code die aktuelle Iteration beenden und auf die nächste Iteration gehen? Wenn ich nicht Liste Verständnis verwenden können Fehler während der Iteration zu fangen, dann muss ich die normale for Schleife verwenden:

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

Ich möchte wissen, wenn ich verwenden try-except Ausnahmebehandlung in Liste Verständnis zu tun.

+5

„Ich verwende eine Liste Verständnis eine Liste von Dateien auf diese Funktion iterieren“ * hust * * hust * ** ** COUGHCHOKERETCH –

+3

Es sei denn, Sie sind Benutze die Liste, die durch das Listenverständnis erzeugt wurde, bleibe bei der for-Schleife. – chepner

+0

Was ist los mit der 'for' Schleife? –

Antwort

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

Wenn plot_pdf(f) einen Fehler bei der Ausführung des Verstehens wirft, ist es dann in der except Klausel, andere Elemente in Verständnis ausgewertet werden nicht abgefangen wird.

Es ist nicht möglich, Ausnahmen in einem Listenverständnis zu behandeln, denn ein Listenverständnis ist ein Ausdruck, der einen anderen Ausdruck enthält, nichts mehr (d. H. Keine Anweisungen und nur Anweisungen können Ausnahmen abfangen/ignorieren/behandeln).

Funktionsaufrufe sind Ausdruck und die Funktionskörper können alle die Anweisungen, die Sie wollen, so die Auswertung der auf eine Funktion Ausnahme anfällige Unterausdruck zu delegieren, wie Sie, wird bemerkt haben ein Machbare Umgehung (andere, wenn möglich, sind Überprüfungen der Werte , die Ausnahmen auslösen könnten, wie auch in anderen Antworten vorgeschlagen).

More here.

+0

Danke. Dies hilft mir, mehr über das Listenverständnis zu verstehen. – tonga

6

Sie sind mit Ihrer for Schleife fest, es sei denn, Sie behandeln den Fehler innerhalb plot_pdf oder einen 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

Ich habe einige Ausnahmen in 'plot_pdf()'. Aber das fängt nicht alle Fehler auf. Daher möchte ich die Ausnahmebehandlung außerhalb des Listenverständnisses verwenden. Ich möchte nur wissen, ob der try-except-Block Auswirkungen auf das Listenverständnis hat. Wenn nicht, kann ich nur reguläre for-Schleife verwenden, um die meisten Ausnahmen zu erfassen. – tonga

+1

Verwenden Sie also eine reguläre for-Schleife. –

1

könnten Sie erstellen ein catch Objekt

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

Dann können Sie

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

tun Und dann können Sie tun, was Sie mit dem Ergebnis wollen:

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

Leider wird dies nicht auch nur annähernd C Geschwindigkeit sein, see my question here