KeyError是否适当的例外?

时间:2013-04-21 13:22:34

标签: python exception

我正在Github上创建一个开源项目,我想确保尽我所能使它变得强大,稳定并且它的Pythonic。为此,我有一个问题,当我希望密钥存在于字典中并且不包括在内时,我应该使用什么样的异常。

也就是说,调用函数类似于:

def calling_func():
    my_dict = {
        'value_1': 1,
        'value_2': None,
        'value_3': '3',
    }

    foo(my_dict)

我的函数foo希望字典包含key(以及相应的value),value_4。在下列情况下提出KeyError是否合适?

def foo(my_dict):
    expected_keys = ['value_1', 'value_2', 'value_3', 'value_4']

    for key in expected_keys:
        if key not in my_dict:
            raise KeyError

似乎KeyError的传统用法与此用法相反。

我应该为此创建自己的异常类型吗?

class MissingKeyError(Exception):
    pass

还是有什么效果?

1 个答案:

答案 0 :(得分:2)

KeyError是适当的例外。

如果可能,请使用Python异常,尤其是适用于第三方的API。这节省了导入和学习曲线。

您可以简化代码:

if not my_dict.viewkeys() >= set(expected_keys):
    raise KeyError

或只是访问所有密钥:

for key in expected_keys:
    my_dict[key]  # test for presence early

只是不测试并让使用该密钥的代码引发异常。