生成器循环中断时抛出异常的原因及代码异常现象解析
生成器迭代中断时的异常分析
代码执行流程与输出原因
当func()被调用时,内部的for循环启动gen()生成器的迭代:
- 第一次迭代时,生成器执行到
yield 1,把1返回给变量x,紧接着return x直接终止了for循环,生成器的迭代被提前中断。 - 在Python中,如果生成器的迭代没有正常完成(比如被提前终止、生成器对象被垃圾回收),解释器会自动向生成器抛出
GeneratorExit异常,目的是让生成器有机会执行清理逻辑。 - 因为
gen()里的yield语句被包裹在try块中,抛出的GeneratorExit被except块捕获,于是执行print('hi')。 - 之后
func()返回1,外层的print(func())输出这个返回值,所以最终先打印hi,再打印1。
引发的具体异常
触发的具体异常是GeneratorExit,它是Python内置的异常类,继承自BaseException(而非普通的Exception),专门用于通知生成器即将被销毁。代码里的except:会捕获所有类型的异常(包括BaseException的子类),所以能触发对应的打印逻辑。
内容的提问来源于stack exchange,提问作者alexwong123
相关产品推荐
相关产品推荐

