Skip to main content
 首页 » 编程设计

python之如果调用者在其上调用了 close() ,生成器能否注意到

2025年05月04日7tuyile006

给定一个简单的生成器:

def myGenerator(max): 
    for i in range(max): 
        yield i 

它可以像这样使用:

>>> gen = myGenerator(10) 
>>> next(gen) 
0 
>>> next(gen) 
1 

当我在生成器上执行 close() 时,对 next 的所有后续调用都会导致 StopIteration 异常。

>>> gen.close() 
>>> next(gen) 
StopIteration exception 

生成器可以注意到这一点吗? yield 不会抛出异常。我正在寻找类似的东西:

def myGenerator(max): 
    for i in range(max): 
        try: 
            yield i 
        except CloseIteration as ex: 
            print("I got closed") 

请您参考如下方法:

正如 Jon 在评论中提到的,calling close() raises a GeneratorExit exception ,您可以观看:

In [1]: def mygenerator(max): 
   ...:     try: 
   ...:         for i in range(max): 
   ...:             yield i 
   ...:     except GeneratorExit: 
   ...:         print('I got closed') 
   ...:         raise 
   ...:      
 
In [2]: gen = mygenerator(10) 
 
In [3]: next(gen) 
Out[3]: 0 
 
In [4]: next(gen) 
Out[4]: 1 
 
In [5]: gen.close() 
I got closed