2013-05-17 3 views
9

У меня есть функция Python, называемая plot_pdf(f), которая может вызывать ошибку. Я использую список понимание перебрать список файлов этой функции:Обработка исключений Python в понимании списка

[plot_pdf(f) for f in file_list] 

Я хочу использовать примерочный, за исключением блока, чтобы пропустить возможные ошибки во время итерации цикла и продолжить со следующим файлом. Итак, следующий код правильный способ обработки исключений в понимании списка Python?

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

Будет ли приведенный выше код прервать текущую итерацию и перейти к следующей итерации? Если я не могу использовать список понимание, чтобы поймать ошибки во время итерации, то я должен использовать нормальный for цикл:

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

Я хочу знать, могу ли я использовать примерочных, за исключением сделать обработку исключений в списке понимание.

+5

«Я использую список понимание перебрать список файлов этой функции» * кашель * * КАШЕЛЬ * ** COUGHCHOKERETCH ** –

+3

Если вы не используя список, созданный пониманием списка, придерживайтесь цикла for. – chepner

+0

Что случилось с циклом 'for'? –

ответ

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

Если plot_pdf(f) выдает ошибку во время выполнения понимания, то он ловится в пункте except, другие элементы в понимании не будут оценены.

Невозможно обрабатывать исключения в понимании списка, поскольку понимание списка - это выражение, содержащее другое выражение, не более того (то есть никакие операторы и только операторы могут захватывать/игнорировать/обрабатывать исключения).

вызовов функций являются выражением и функциональные органы могут включать в себя все заявления вы хотите, так делегировании оценку исключения подверженным подвыражения к функции, как вы заметили, это один возможное обходное решение (другие, когда это осуществимо, являются проверками на значения , которые могут вызывать исключения, также предлагаемые в других ответах).

More here.

+0

Спасибо. Это помогает мне лучше разобраться в понимании списка. – tonga

6

Вы застряли в петле for, если не обрабатываете ошибку внутри plot_pdf или обертку.

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

У меня есть обработка исключений внутри 'plot_pdf()'. Но это не все ошибки. Поэтому я хочу использовать обработку исключений вне понимания списка. Я просто хочу знать, влияет ли блок try-except на эффекты списка. Если нет, то я могу использовать регулярный цикл для исключения большинства исключений. – tonga

+1

Итак, используйте обычный цикл. –

1

Вы можете создать catch объект

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

Тогда вы можете сделать

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

И тогда вы можете делать то, что вы хотите с результатом:

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

К сожалению, это не будет даже отдаленно скорость C, see my question here

Смежные вопросы