如何捕获触发'object is not subscriptable'错误的自定义对象以获取详情?
问题解答
现有代码合理性判断
你给出的try-except代码块不合理,存在三处核心问题:
- 直接调用
CustomObject.__getitem__()不符合该魔术方法的触发逻辑:正常下标访问(如obj[key])会自动传入下标参数触发该方法,直接调用会因缺少必填的key参数抛出参数缺失异常,无法复现你实际遇到的报错 - 裸
except会捕获所有类型的异常,会吞掉无关报错干扰排查 - 你打印的是
CustomObject类本身,不是实际触发报错的类实例,无法得到有效排查信息
正确的捕获实现
将你实际执行业务逻辑中的下标访问代码放入try块,指定捕获TypeError并匹配报错关键词,打印实例相关信息即可,示例如下:
try: # 此处替换为你原本触发报错的下标访问代码 result = your_custom_instance[access_key] except TypeError as e: if "is not subscriptable" in str(e): print(f"报错对象类型:{type(your_custom_instance)}") print(f"报错对象内容:{your_custom_instance}") print(f"对象所有属性与方法:{dir(your_custom_instance)}") print(f"本次访问使用的下标:{access_key}") else: # 非目标异常直接抛出,避免吞错 raise
其他注意事项
- 优先排查变量赋值链路:不定期出现该报错通常是因为你定义的实例变量在部分分支逻辑中被意外赋值为其他无
__getitem__方法的类型(如None、整数、布尔值等),并非你定义的CustomObject类本身的问题 - 如果你的CustomObject本身就需要支持下标访问,可以直接在类定义中实现
__getitem__方法,可在方法内部增加日志打印,直接定位所有调用时机与参数 - 若CustomObject默认打印信息太少,可重写类的
__str__或__repr__方法,输出实例的关键标识属性,提升排查效率 - 不要在生产环境长期保留无边界的异常捕获逻辑,定位到问题后及时移除相关调试代码
内容的提问来源于stack exchange,提问作者Jürgen K.
相关产品推荐
相关产品推荐

