2013-05-17 7 views
9

Mam funkcję Python o nazwie plot_pdf(f), która może spowodować błąd. Używam listowych iteracyjne nad listę plików w tej funkcji:Obsługa wyjątków w języku Python w zrozumieniu listy

[plot_pdf(f) for f in file_list] 

chcę korzystać z wyjątkiem bloku try-pominąć ewentualne błędy podczas iteracji i przejść do następnego pliku. Czy poniższy kod jest prawidłowym sposobem obsługi wyjątków w zrozumieniu listy w języku Python?

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

Czy powyższy kod przerwie bieżącą iterację i przejdzie do następnej iteracji? Jeśli nie mogę korzystać listowych złapać błędy podczas iteracji, to muszę używać normalnego for pętlę:

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

Chcę wiedzieć, czy mogę użyć try-except zrobić obsługę wyjątków w listowego.

+5

„Używam listowych iteracyjne nad listę plików na tej funkcji” * kaszlu * * Kaszel * ** ** –

+3

COUGHCHOKERETCH Chyba że jesteś używając listy stworzonej przez zrozumienie listy, trzymaj się pętli for. – chepner

+0

Co jest nie tak z pętlą 'for'? –

Odpowiedz

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

Jeśli plot_pdf(f) zgłasza błąd podczas wykonywania zrozumieniem, a potem, że zostanie złapany w klauzuli except, pozostałe pozycje w zrozumieniu nie będą oceniane.

Nie można obsłużyć wyjątków w zrozumieniu listy, ponieważ zrozumienie listy jest wyrażeniem zawierającym inne wyrażenie, nic więcej (tj. Brak instrukcji i tylko instrukcje mogą przechwytywać/ignorować/obsługiwać wyjątki).

wywołania funkcji są wyrazem, a organy funkcyjne mogą obejmować wszystkie sprawozdań chcesz, więc delegowanie ocenę wyjątku podatnych na sub-wypowiedzi do funkcji, jak zauważyłeś, jest jednym wykonalne obejście (inne, jeśli jest to wykonalne, sprawdzają wartości , które mogą wywoływać wyjątki, jak również sugerowane w innych odpowiedziach).

More here.

+0

Dzięki. Pomaga mi to lepiej zrozumieć zrozumienie listy. – tonga

6

Utkniesz z pętlą for, chyba że zajmiesz się błędem wewnątrz plot_pdf lub otokiem.

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

Mam pewne wyjątkowe traktowanie wewnątrz 'plot_pdf()'. Ale to nie łapie wszystkich błędów. Dlatego chcę używać wyjątków poza zrozumieniem listy. Chcę tylko wiedzieć, czy blok try-except ma wpływ na zrozumienie listy. Jeśli nie, mogę użyć zwykłej pętli for do wychwycenia - większość wyjątków. – tonga

+1

Używaj zwykłej pętli for. –

1

Można by stworzyć catch obiekt

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

Następnie można zrobić

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

A potem możesz robić co chcesz z wynikiem:

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

Niestety to nie będzie nawet zdalnie prędkość C see my question here