捕捉不同的类型错误

Catching different TypeErrors

我有一本字典,里面有三种不同的键值对。这些值是三种形状之一:字典、null 或整数,例如:

dic = {"range" : {"val": 1, "size": 2},
       "length" : {"val": 5, "radius": 1},
       "power": null,
       "current": 5}

我正在使用一个 try-except 块,字典值为默认值,并且想分别捕获 null 和 integer 的 TypeError。对于 null 值,它给出“TypeError:'NoneType' object is not subscriptable”,对于整数,它给出“TypeError:'int' object is not subscriptable”。如何在不同的异常中捕获这些错误?我正在遍历字典中感兴趣的键,下面是我当前正在做的一个例子,但是它捕获了两个错误,因为它们都是 TypeError:

for kw in list_of_keys:
    try:
        val_test = dic[kw]['val']
    except TypeError:
        val_test = dic[kw]

我想捕获类似于以下内容的错误:

for kw in list_of_keys:
    try:
        val_test = dic[kw]['val']
    except TypeError: 'int' object is not subscriptable:
        val_test = dic[kw]
    except TypeError: 'NoneType' object is not subscriptable:
        val_test = "Not implemented / Not given yet"

感谢您的帮助!

例外是为了特殊的结果。在这里,Noneint 值似乎与 dict 值一样有效,因此您应该先查看 dic[kw],然后再假设它是 dict

for kw in list_of_keys:
    v = dic[kw]
    if v is None:
        val_test = "Not implemented / Not given yet"
    else:
        try:
            val_test = v['val']
        except TypeError:
            val_test = v

一旦确定 v 是否为 None 然后 您可以尝试对其进行索引并假设它是 intTypeError.

您可以使用 type() 关键字来检查变量是 Integer 还是 NoneType 并相应地使用 try-except。

否则检查变量是否可订阅:

from collections.abc import Iterable

if isinstance(theElement, Iterable):
    # iterable
else:
    # not iterable

您还可以使用 hasattr(myObj, '__getitem__') 通过 __getitem__ 方法检查对象,例如 dict。

您可以使用 .get() 来检查 Noneboolenisinstance 方法来检查它是否是 integer

for kw in list_of_keys:

    val = dic.get(kw)
    
    if not val:
       val = "NoneType Error"
    
    elif isinstance(val,int):
       val = "Integer Error"
    
    else:
        val=val['val']