如何提升自定义字典的KeyError消息

5 投票
1 回答
7415 浏览
提问于 2025-04-17 04:29

我正在写一些脚本,这些脚本将被不懂Python的用户使用。我有一个配置类(Config),里面有一些字典,我想在出现KeyError(键错误)时能够抛出一个自定义的异常。除了写一个方法在检查字典中的值时抛出异常,还有没有更优雅的办法呢?

这里有个例子:

class ConfigError(Exception): pass

class Config:
    def __init__(self):
        self.cars = {'BMW': 'M5', 'Honda': 'Civic'}

    def get_car(self, name):
        try:
            return self.cars[name]
        except KeyError, e:
            raise ConfigError("Car %s doesn't exist!!!" % name)

conf = Config()
print 'Car: %s' % conf.cars['BMW']
print 'Car: %s' % conf.cars['Mercedes']

这是输出结果:

Car: M5 
Traceback (most recent call last):
  File "test.py", line 17, in ?
    print 'Car: %s ' % conf.cars['Mercedes']
KeyError: 'Mercedes'

我知道我可以像上面那样写一个方法Config.get_car()并抛出一个自定义异常,但我希望在直接访问Config.cars字典时就能抛出这个自定义异常。我想这样做是因为配置中实际上还有更多的字典,但我只需要为其中一个字典抛出自定义异常,并且希望保持数据访问的一致性(都作为字典来访问)。

注意:这是在使用Python 2.4.4版本。

1 个回答

5

考虑这样做。

class MyConfigDict( dict ):
    def __getitem__( self, key ):
        try:
            return super( MyConfigDict, self ).__getitem__( key )
        except KeyError as e:
            raise MyConfigError( e.message )

像这样的做法可能让你在每次访问的时候都能用你自己定义的扩展异常来包裹。

撰写回答