【发布时间】:2014-06-14 08:34:18
【问题描述】:
TL;DR
是否有可能在 finally 子句中找出是否存在未捕获的异常?
背景
我想迭代项目以对其进行一些相对昂贵的处理,这可能会中断并引发异常。所以我想保住我的位置。 但是保存状态也相当昂贵 - 所以我不想每次都这样做,只是在我屈服的代码中有异常时。
我在想象一些形状模糊的东西:
def get_things(my_iterator):
for items in my_iterator:
try:
yield item
finally:
if something_went_wrong(): # magic oracle function for failure
save_state(item)
continue_normal_processing()
但我不知道这是否可能。值得注意的是,except Exception: 不会引发任何事情,因为异常不在此函数中。
【问题讨论】:
-
你的意思是其他地方在这个生成器之外引发了一个异常?那么
try:/finally:不是解决这个问题的正确方法;try这里没有任何内容。 -
yield如何引发异常?如果在生成下一个项目时发生异常,那么循环不是已经引发了吗?另外,为什么不在这里使用except而不是finally? -
究竟是什么引发了异常?
my_iterator是异常的来源吗? -
您应该将 TD;DR 部分作为第一句话发布,因为这会作为该问题的简短描述显示给回答者。
标签: python exception-handling yield finally