Python中如何分别捕获int与NoneType触发的不同TypeError异常
实现方案
Python 不支持直接在except分支中按异常的错误信息做匹配捕获,你可以通过以下两种方案实现需求:
方案1:捕获TypeError后匹配错误信息
该方案完全匹配你提供的伪代码逻辑,直接通过异常内容区分两种触发场景:
# 注意Python中空值为None,示例字典定义如下 dic = { "range": {"val": 1, "size": 2}, "length": {"val": 5, "radius": 1}, "power": None, "current": 5 } list_of_keys = ["range", "length", "power", "current"] for kw in list_of_keys: try: val_test = dic[kw]['val'] except TypeError as e: err_info = str(e) if "'int' object is not subscriptable" in err_info: val_test = dic[kw] elif "'NoneType' object is not subscriptable" in err_info: val_test = "Not implemented / Not given yet" else: # 非预期的TypeError原样抛出 raise print(val_test)
方案2:提前判断值类型(更稳定易维护)
你已经明确知道字典值只有字典、None、整数三类,提前做类型判断不需要依赖异常信息,不会因为Python版本迭代修改异常表述导致逻辑失效:
for kw in list_of_keys: current_val = dic[kw] if isinstance(current_val, dict): # 优先取val字段,不存在的话可按需调整返回逻辑 val_test = current_val.get('val', current_val) elif current_val is None: val_test = "Not implemented / Not given yet" elif isinstance(current_val, int): val_test = current_val else: # 其他类型可按需补充处理逻辑 val_test = current_val
两种方案的运行输出一致:
range: 1
length: 5
power: Not implemented / Not given yet
current: 5
内容的提问来源于stack exchange,提问作者PJ Drop
相关产品推荐
相关产品推荐

