为何getattr()在try语句中抛异常会致程序退出?如何解决?
问题分析与解决方案
为什么异常未被捕获?
你当前的try-except只捕获了ImportError,但遇到未定义的类时抛出的是AttributeError——这是因为模块table_builders已经成功导入,只是调用getattr()从模块中获取不存在的类时触发的错误,不在ImportError的捕获范围内,所以程序会直接终止,不会执行except块的打印语句。
简单区分两种异常场景:
ImportError:模块本身找不到或导入失败时抛出AttributeError:模块存在,但指定的属性(类)不存在时抛出
你的代码只处理了第一种错误,没覆盖第二种,导致异常漏网。
如何实现失败时不退出的导入?
有两种实用的解决方式:
方式1:扩展异常捕获范围
把AttributeError也加入except的捕获列表,确保两种错误都能被处理,示例代码:
import table_builders builders_list = ["ValidTableBuilder", "MissingTableBuilder"] for builder_name in builders_list: try: builder_class = getattr(table_builders, builder_name) print(f"成功加载构建器: {builder_name}") # 这里添加对构建器类的后续逻辑 except (ImportError, AttributeError) as e: print(f"加载{builder_name}失败: {str(e)}") # 捕获异常后继续循环,程序不会退出
方式2:提前检查属性是否存在
用hasattr()先判断模块中是否存在目标类,避免触发异常,代码更直观:
import table_builders builders_list = ["ValidTableBuilder", "MissingTableBuilder"] for builder_name in builders_list: if hasattr(table_builders, builder_name): builder_class = getattr(table_builders, builder_name) print(f"成功加载构建器: {builder_name}") else: print(f"构建器{builder_name}未在table_builders模块中定义") # 直接跳过不存在的类,继续循环
两种方式都能实现“失败不退出”的需求,你可以根据代码风格偏好选择。
内容的提问来源于stack exchange,提问作者Graham B
相关产品推荐
相关产品推荐

