14

我有一个调用的 Python 函数plot_pdf(f),它可能会引发错误。我使用列表推导来迭代此函数上的文件列表:

[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 在列表理解中进行异常处理。

4

3 回答 3

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

如果plot_pdf(f)在执行理解的过程中抛出错误,那么它会被捕获在except子句中,理解中的其他项目将不会被评估。

在列表推导中处理异常是不可能的,因为列表推导是一个包含其他表达式的表达式,仅此而已(即没有语句,只有语句可以捕获/忽略/处理异常)。

函数调用是表达式,函数体可以包含您想要的所有语句,因此,正如您所注意到的,将容易发生异常的子表达式的评估委托给函数是一种可行的解决方法(如果可行,其他方法是检查可能引发异常的值,正如其他答案中所建议的那样)。

更多在这里。

于 2013-05-17T14:26:30.907 回答
9

除非您处理内部错误或包装器,否则您将陷入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]
于 2013-05-17T14:04:38.250 回答
4

你可以创建一个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 速度,请在此处查看我的问题

于 2015-03-02T18:13:36.717 回答