我想执行几个函数,收集它们的异常(如果有的话),并引发一个复合异常,调用尽可能多的函数而不会在一个异常后中断。例如,说我有
def f():
do_one()
do_two()
do_three()
这些do_i
功能不依赖于彼此的状态。做我想做的最明显的方法是:
def f():
errors = []
for do_i in [do_one, do_two, do_three]:
try:
do_i()
except Exception as e:
errors.append(e)
if errors:
raise Exception(';'.join(errors))
或稍微好一点:
def catch_error(arr, f, *args, **kwargs):
try:
return f(*args, **kwargs)
except Exception as e:
arr.append(e)
return None
def f():
errors = []
for do_i in [do_one, do_two, do_three]:
catch_error(errors, do_i)
if errors:
raise Exception(';'.join(errors))
但这仍然很丑陋。有没有一种我缺少的 Pythonic 方法来做到这一点,也许巧妙地使用了一个with
语句?
编辑:在一个梦想的世界里,Python 会有这个:
errors = []
awesome_block(errors):
do_one()
do_two()
do_three()
return 'yes!' if not errors else ';'.join(map(str, errors))