Python 最终尝试收益率-我们是否提出了异常? TL;博士

Python 最终尝试收益率-我们是否提出了异常? TL;博士,python,exception-handling,yield,finally,Python,Exception Handling,Yield,Finally,是否有可能在finally子句中发现是否存在未完成的未捕获异常 背景 我想对项目进行迭代,对其进行一些相对昂贵的处理,这可能会导致中断并引发异常。所以我想保住我的位置。 但是保存状态也是相当昂贵的——所以我不希望每次都这样做,就在我允许的代码中出现异常的时候 我在想象一些模糊的形状,比如: def get_things(my_iterator): for items in my_iterator: try: yield item f

是否有可能在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()

但我不知道这是否可能。值得注意的是,
异常除外:
不会引发任何异常,因为异常不在此函数中。

这应该与您想要的类似:

class CatchingExceptionsIterator:
    def __init__(self, generator):
        self.generator = generator
        self.error = None
    def __enter__(self):
        return self
    def next(self):
        if self.error is None:
            return next(self.generator)
        else:
            error = self.error
            self.error = None
            return self.generator.throw(*error)
    __next__ = next
    def __exit__(self, ty, err, tb):
        if ty is not None:
            self.error = ty, err, tb
            return True
    def __iter__(self):
        return self


def f():
    for i in range(10):
        try:
            print("yield")
            yield i
            print("returnFomYield")
        except:
            import traceback
            traceback.print_exc()


c = CatchingExceptionsIterator(f())
for i in c:
    with c:
        print(i)
        if i == 5:
            nameerror
必须对其进行调整,以适应确切的用例。
输出为:

yield
0
returnFomYield
yield
1
returnFomYield
yield
2
returnFomYield
yield
3
returnFomYield
yield
4
returnFomYield
yield
5
Traceback (most recent call last):
  File "withiteration.py", line 27, in f
    yield i
  File "withiteration.py", line 39, in <module>
    nameerror
NameError: name 'nameerror' is not defined
yield
6
returnFomYield
yield
7
returnFomYield
yield
8
returnFomYield
yield
9
returnFomYield
产量
0
返回福米菲尔德
产量
1.
返回福米菲尔德
产量
2.
返回福米菲尔德
产量
3.
返回福米菲尔德
产量
4.
返回福米菲尔德
产量
5.
回溯(最近一次呼叫最后一次):
文件“withiteration.py”,第27行,在f中
产量一
文件“withiteration.py”,第39行,在
名称错误
NameError:未定义名称“NameError”
产量
6.
返回福米菲尔德
产量
7.
返回福米菲尔德
产量
8.
返回福米菲尔德
产量
9
返回福米菲尔德
还将执行一个附加的finally条款

是否有可能在finally子句中发现是否存在未完成的未捕获异常


为什么??除了,您可以使用
。更详细地解释这一点。

。。。看来除了
的行为之外,我对的看法完全错了

def f():
    for i in range(10):
        try:
            yield i
        except Exception:
            print "Nope, this broke"
            raise


for x in f():
    print x
    if x == 2:
        raise IndexError
返回

0
1
2
Nope, this broke
Traceback (most recent call last):
...
IndexError

你的意思是在这个生成器之外的其他地方引发了异常?然后
尝试:
/
最后:
不是正确的方法;这里没有什么可以尝试的。
如何产生异常?如果在生成下一项时发生异常,那么循环是否已经引发了异常?另外,为什么不在这里使用
except
而不是
finally
?引发异常的确切原因是什么?
my_iterator
是异常的来源吗?你应该发布TD;DR part作为第一句话,因为这是对回答问题的人的简短描述。我没想到会有这种行为。酷。下一个对此感到困惑的人的更多信息:在生成器的垃圾收集过程中打印出“Nope,this break”字样。值得一提的是,我只是在2.7.12上运行了这个代码示例,没有打印出“Nope,this break”。@DanielStutzbach-澄清一下,你是说这种行为只发生在
f()上吗
是一个函数吗?在Python3.8中,它在不进行处理的情况下引发
索引器。