列表推导中的Python异常处理

ton*_*nga 10 python exception-handling list-comprehension

我有一个调用的Python函数plot_pdf(f)可能会抛出错误.我使用列表推导来迭代这个函数上的文件列表:

[plot_pdf(f) for f in file_list]
Run Code Online (Sandbox Code Playgroud)

我想使用try-except块在迭代循环期间跳过任何可能的错误并继续下一个文件.以下代码在Python列表理解中进行异常处理的正确方法是什么?

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

上面的代码会终止当前的迭代并进入下一次迭代吗?如果我不能使用列表推导来捕获迭代期间的错误,那么我必须使用正常for循环:

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

我想知道我是否可以使用try-except在列表理解中进行异常处理.

kir*_*off 15

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

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

因为列表理解是包含其他表达式的表达式,所以不可能处理列表解析中的异常(即没有语句,只有语句可以捕获/忽略/处理异常).

函数调用是表达式,函数体可以包含你想要的所有语句,所以如你所知,将容易出错的子表达式的评估委托给一个函数是一种可行的解决方法(其他的,如果可行的话,是检查可能引发异常的值,如其他答案中所建议的那样).

更多这里.


Dae*_*yth 8

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]
Run Code Online (Sandbox Code Playgroud)


vit*_*ral 6

你可以创建一个catch对象

def catch(error, default, function, *args, **kwargs):
    try: return function(*args, **kwargs)
    except error: return default
Run Code Online (Sandbox Code Playgroud)

然后你可以做

# using None as default value
result (catch(Exception, None, plot_pdf, f) for f in file_list)  
Run Code Online (Sandbox Code Playgroud)

然后你可以对结果做你想做的事:

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

不幸的是,这甚至远达不到 C 速度,请参阅我的问题here