Python 对象中覆盖 traceback 调用,实现同类深层嵌套对象属性异常捕获
实现自定义属性不存在提示的方案
核心原理
Python 访问类实例不存在的属性时,会自动触发魔术方法
__getattr__,我们可以通过重写该方法拦截默认的属性错误抛出逻辑,实现自定义提示,代替原生堆栈输出。
代码实现
1. 自定义嵌套类,重写__getattr__
class NestedObject: def __init__(self, attr_dict=None, child=None): # 初始化当前层级属性 if attr_dict: for k, v in attr_dict.items(): setattr(self, k, v) # 存储下层嵌套的同类型实例 self.child = child def __getattr__(self, attr_name): # 仅访问不存在的属性时触发该方法 raise AttributeError("there is no attribute in this level")
2. 嵌套对象构造与测试
# 构造三层嵌套结构 level3 = NestedObject({"score": 90}) level2 = NestedObject({"age": 25}, child=level3) level1 = NestedObject({"name": "张三"}, child=level2) # 正常访问存在的属性 print(level1.name) # 输出:张三 print(level1.child.child.score) # 输出:90
3. 上层调用捕获异常,屏蔽堆栈
如果希望完全不输出错误堆栈,只打印自定义提示,在上层调用处加异常捕获即可:
try: # 访问不存在的属性 print(level1.child.height) except AttributeError as e: print(e)
以上代码运行后只会输出there is no attribute in this level,不会打印原生属性错误的堆栈信息。
注意事项
- 不要使用
__getattribute__实现该需求:该方法会拦截所有属性的访问请求,使用不当很容易触发死循环;__getattr__仅在属性不存在时触发,完全适配当前场景,不会影响正常属性的访问。 - 如果类需要支持动态属性生成,可以在
__getattr__中先做属性名规则校验,匹配规则的返回对应动态值,不匹配的再输出自定义提示即可。
内容的提问来源于stack exchange,提问作者Kaiz Lee
相关产品推荐
相关产品推荐

