如果在dict中遇到None值,如何引发异常?

时间:2010-12-23 09:28:25

标签: python python-2.x

如果返回的值为KeyError,我想提出None异常,但以下内容会引发SyntaxError: invalid syntax异常。

try:
   protocol = serverInfo_D['protocol'] or raise KeyError("protocol not present")
except KeyError:
   print "Improper server config"

这是一种简单的方法吗?

5 个答案:

答案 0 :(得分:6)

你得到一个SyntaxError因为raise是一个语句而不是一个表达式,所以or raise KeyError部分不会使[语法]有意义。一种解决方法是将其放入如下所示的函数中,只有在查找的值为非True的情况下才会调用此函数,例如None0''[]

警告:请注意,执行此操作可能会造成混淆,因为它实际上会使任何这些类型的值的存在看起来好像protocol键不是虽然从技术上来说它是......所以你可能想考虑从built-ins中的一个派生你自己的专门异常类,然后使用KeyError {{3来处理那些而不是[ab] }}

def raise_KeyError(msg=''): raise KeyError(msg)  # Don't return anything.

try:
   protocol = serverInfo_D['protocol'] or raise_KeyError('protocol not present')
except KeyError:
   print 'Improper server config!'

答案 1 :(得分:5)

如果你想要它在一行中,你总是可以创建一个函数:

def valueOrRaise(data, key):
    value = data.get(key)
    if value is None:
        raise KeyError("%s not present" % key)
    return value

try:
    protocol = valueOrRaise(serverInfo_D, 'protocol')
except KeyError:
    print "server config is not proper"

答案 2 :(得分:2)

如果你真的像这样使用它,你为什么要有例外?只需使用.get()并检查None

protocol = serverInfo_D.get('protocol')
if protocol is None:
   print "server config is not proper"

答案 3 :(得分:1)

tryexcept KeyError组合应该有效。什么不适合你?

由于这是继续您之前的问题,因为您使用的dict.get永远不会引发KeyError,因此无效。

然而,这个问题中的代码会。而且您不需要or raise KeyError

>>> d = dict(a=1, b=2)
>>> d.get('c')  # no KeyError
>>> d['c']      # KeyError
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
KeyError: 'c'

答案 4 :(得分:0)

我认为这更像是你想要的。如果您需要更改,请发表评论。

try:
    protocol = serverInfo_D['protocol'] 
    if protocol == None:
        raise KeyError("protocol not present")

希望这有帮助