我有一个名为plot_pdf(f)
的Python函数可能会抛出错误。我使用列表推导来迭代这个函数上的文件列表:
[plot_pdf(f) for f in file_list]
我想使用try-except块在迭代循环期间跳过任何可能的错误并继续下一个文件。以下代码在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
我想知道我是否可以使用try-except在列表解析中进行异常处理。
答案 0 :(得分:13)
try:
[plot_pdf(f) for f in file_list] # using list comprehensions
except:
print ("Exception: ", sys.exc_info()[0])
continue
如果plot_pdf(f)
在执行理解期间抛出错误,那么它会被except
子句捕获,其他理解项目将不会被评估。
无法处理列表推导中的异常,因为列表推导是包含其他表达式的表达式,仅此而已(即没有语句,只有语句可以捕获/忽略/处理异常)。
函数调用是表达式,函数体可以包含all 你想要的陈述,所以委托评价 正如您所注意到的那样,函数的异常子表达式是 一个可行的解决方法(其他,在可行的情况下,是对价值的检查) 这可能会引发异常,正如其他答案中所建议的那样)。
答案 1 :(得分:7)
除非您在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]
答案 2 :(得分:2)
您可以创建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