【问题标题】:Python exception handling in list comprehension列表理解中的 Python 异常处理
【发布时间】:2013-05-17 14:02:41
【问题描述】:

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

【问题讨论】:

标签: python exception-handling list-comprehension


【解决方案1】:
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.

【讨论】:

  • 谢谢。这有助于我更多地了解列表理解。
  • @kiriloff,未来版本的理解不能包含except 子句是否有技术原因?例如[x[1] for x in list except IndexError pass]
【解决方案2】:

除非您在 plot_pdf 或包装器中处理错误,否则您会被 for 循环所困扰。

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]

【讨论】:

  • 我在plot_pdf() 中有一些异常处理。但这并不能捕获所有错误。所以我想在列表理解之外使用异常处理。我只想知道 try-except 块是否对列表理解有任何影响。如果没有,那么我只能使用常规 for 循环来捕获大多数异常。
  • 所以使用常规的 for 循环。
【解决方案3】:

你可以创建一个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

【讨论】:

    猜你喜欢
    • 2015-02-08
    • 2021-09-16
    • 2019-12-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多