列表推导中的Python异常处理

时间:2013-05-17 14:02:42

标签: python exception-handling list-comprehension

我有一个名为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在列表解析中进行异常处理。

3 个答案:

答案 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   你想要的陈述,所以委托评价   正如您所注意到的那样,函数的异常子表达式是   一个可行的解决方法(其他,在可行的情况下,是对价值的检查)   这可能会引发异常,正如其他答案中所建议的那样)。

More here.

答案 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