生成器通过异常处理提升程序健壮性。默认情况下,未捕获的异常会终止迭代,如除零错误直接抛出;可在生成器内用 try-except 捕获并跳过非法值,保持运行;通过 throw() 方法可从外部注入异常,触发内部逻辑处理;调用 close() 时引发 GeneratorExit,用于资源清理,需重新抛出以确保正确关闭。掌握这些机制可实现安全的惰性计算。

生成器是 Python 中一种强大的工具,它允许我们按需生成值,节省内存并提升性能。但在使用生成器时,可能会遇到各种异常情况,比如数据格式错误、文件读取失败或用户中断操作。合理地在生成器中处理异常,能让程序更健壮、更安全。
生成器中的异常传播机制
生成器函数在执行过程中如果发生异常且未被捕获,异常会向外抛出,并终止生成器的迭代。
例如:
def data_reader(data_list):
for item in data_list:
yield 1 / item
gen = data_reader([1, 2, 0, 4])
print(next(gen)) # 输出 1.0
print(next(gen)) # 输出 0.5
print(next(gen)) # 抛出 ZeroDivisionError
当遍历到 0 时,ZeroDivisionError 被触发并直接抛出。这种行为是默认的异常传播方式。
立即学习“Python免费学习笔记(深入)”;
在生成器内部捕获异常
我们可以在生成器内部使用 try-except 捕获异常,选择继续执行或跳过问题项。
示例:跳过非法输入
def safe_reciprocal(data_list):
for item in data_list:
try:
yield 1 / item
except ZeroDivisionError:
print(f”跳过零值: {item}”)
except TypeError:
print(f”类型错误,跳过: {item}”)
这样即使遇到异常,生成器仍可继续运行,不会中断整个流程。
从外部向生成器抛入异常
通过 throw() 方法,可以在生成器暂停时手动引发异常。
这在协程或状态机中特别有用。
def monitor():
try:
while True:
value = yield
if value raise ValueError(“负数不被允许”)
except ValueError as e:
print(f”捕获异常: {e}”)
finally:
print(“监控结束”)
m = monitor()
next(m) # 启动生成器
m.send(10) # 正常
m.throw(ValueError(“测试异常”)) # 主动抛入异常
调用 throw 后,异常会在生成器当前暂停点触发,并由内部的 except 捕获。
关闭生成器时的清理工作
使用 close() 方法关闭生成器时,会自动引发 GeneratorExit 异常,可用于资源清理。
def file_reader(filename):
f = open(filename)
try:
for line in f:
yield line.strip()
except GeneratorExit:
print(“生成器被关闭,正在关闭文件”)
f.close()
raise # 必须重新抛出 GeneratorExit
确保 close() 调用后文件能正确释放,避免资源泄漏。
基本上就这些。掌握异常处理在生成器中的应用,能让你写出更稳定、更可控的惰性计算逻辑。关键是理解异常如何进出生成器,并善用 try-except 和生成器方法如 throw 与 close。
以上就是Python 异常处理在生成器中的应用的详细内容,更多请关注创想鸟其它相关文章!
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1380916.html
微信扫一扫
支付宝扫一扫