python

当前位置:首页 > python高级知识 > 当前文章

python高级知识

生成器close()方法详解(StopIteration,GeneratorExit,RuntimeError)

2020-05-18 66赞 python中国网
每篇文章努力于解决一个问题!python高级、python面试全套、操作系统经典课等可移步文章底部。

  关于生成器的close()方法,本文主要讲解4个方面,通过如下几点可以彻底理解close()方法!

  1、生成器使用 close() 方案后就无法再进行迭代,再使用next()函数会抛出 StopIteration 异常。

  2、生成器调用 close() 方法会在程序停止运行的位置抛出 GeneratorExit异常 ,但前提是至少调用一次生成器的next方法后系统才会产生GeneratorExit异常,如果生成器没有启动则不会抛出异常。

  3、生成器函数内捕获GeneratorExit异常后,可以继续执行剩余的代码,但剩余代码中不能再包含 yield 语句,否则会抛出RuntimeError异常

  4、GeneratorExit异常不能通过Exception捕获,Exception是常规异常的基类,而GeneratorExit并不是常规异常的基类,可以通过所有异常的基类BaseException来捕获。

  第1点的代码:

def test(num):
    for i in range(num):
        yield i
    print('我爱www.python66.com')


gen = test(3)
print(next(gen))

gen.close()
print(next(gen))

Traceback (most recent call last):
  File "D:/pyscript/py3script/python66/test2/test.py", line 14, in 
    print(next(gen))
0
StopIteration



  第2点的代码:

# -*- coding: utf-8 -*-


def test():
    try:
        yield 1
    except GeneratorExit:
        print('GeneratorExit抛出')

gen = test()
print(next(gen))  # 生成器启动
gen.close()

print('======分界线===========')

def test():
    try:
        yield 1
    except GeneratorExit:
        print('GeneratorExit抛出')


gen = test()
gen.close() # 未启动生成器不会有异常

1
GeneratorExit抛出
======分界线===========


  第3点的代码:

# -*- coding: utf-8 -*-


def test():
    try:
        yield 1
    except GeneratorExit:
        print('GeneratorExit抛出')
    print('我爱www.python66.com')

gen = test()
print(next(gen))  # 生成器启动
gen.close()

1
GeneratorExit抛出
我爱www.python66.com


# -*- coding: utf-8 -*-

def test():
    try:
        yield 1
    except GeneratorExit:
        print('GeneratorExit抛出')
    yield 2


gen = test()
print(next(gen))
gen.close()

1
Traceback (most recent call last):
GeneratorExit抛出
  File "D:/pyscript/py3script/python66/test2/test.py", line 13, in 
    gen.close()
RuntimeError: generator ignored GeneratorExit


  第4点的代码:

# -*- coding: utf-8 -*-

def test():
    try:
        yield 1
    except BaseException: # GeneratorExit的基类
        print('GeneratorExit抛出')


gen = test()
print(next(gen))
gen.close()

print('======分界线======')

def test():
    try:
        yield 1
    except Exception:
        print('GeneratorExit抛出')


gen = test()
print(next(gen))
gen.close()
1
GeneratorExit抛出
======分界线======
1

文章评论

生成器close()方法详解(StopIteration,GeneratorExit,RuntimeError)文章写得不错,值得赞赏