Skip to main content
 首页 » 编程设计

python之我可以在列表理解中捕获错误以确保循环所有列表项吗

2025年05月04日10findumars

我有一个过滤列表的列表理解:

l = [obj for obj in objlist if not obj.mycond()] 

但是对象方法 mycond() 可以引发异常,我必须拦截。我需要在循环结束时收集所有错误以显示哪个对象产生了任何问题,同时我想确保循环所有列表元素。

我的解决方案是:

errors = [] 
copy = objlist[:] 
 
for obj in copy: 
    try: 
        if (obj.mycond()): 
            # avoiding to touch the list in the loop directly 
            objlist.remove(obj)  
    except MyException as err: 
        errors = [err] 
if (errors): 
   #do something 
 
return objlist 

在这篇文章 ( How to delete list elements while cycling the list itself without duplicate it ) 中,我询问是否有更好的方法来循环避免列表重复。

如果我忽略异常问题,社区会回答我避免就地修改列表并使用适用的列表理解。

您认为有替代解决方案吗?我可以使用列表理解以这种方式管理异常吗?在这种情况下并使用大列表(我必须考虑大吗?)我必须找到另一种选择吗?

请您参考如下方法:

我会使用一点辅助功能:

def f(obj, errs): 
  try: return not obj.mycond() 
  except MyException as err: errs.append((obj, err)) 
 
errs = [] 
l = [obj for obj in objlist if f(obj, errs)] 
if errs: 
  emiterrorinfo(errs) 

请注意,通过这种方式,您可以在errs中包含所有错误对象和每个对象对应的特定异常,因此诊断可以准确和完整;以及您需要的 l,并且您的 objlist 仍然完好无损,可以进一步使用。不需要复制列表,也不需要对 obj 的类进行任何更改,代码的整体结构非常简单。