2010-12-23 84 views
5

我想引发KeyError异常,如果返回值是None,但是这将引发一个错误:“语法错误:无效的语法”蟒蛇字典:引发异常,如果没有价值遇到

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

什么是简单的方法得到这个工作?

+1

AFAIK如果指定的键缺失,Python的字典已经抛出KeyError异常。 – Simone 2010-12-23 09:33:30

+1

@Simone - 他试图在值为'None'时引发异常,而不仅仅是当密钥丢失时。 – Yarin 2014-01-10 15:38:11

回答

5

你得到一个SyntaxError因为raise是一个语句不是表达式,所以or raise KeyError部分不使[语法]有意义。一种解决方法是将它放入像下面这样的函数中,仅当查找的值非真时才会调用该函数,如None0''[]

买者:请注意,这样做可能造成混乱,因为它有效的作用是使任何这些类型的值的存在似乎是仿佛关键是不存在,即使在技术上它是..因此您可能需要考虑从built-ins之一衍生出您自己的特殊异常类,然后使用KeyErrornormally means处理那些而不是[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!' 
0

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

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

希望这有助于

+0

我们不能使用或把它放在一个单一的线..因为我有很多这样的验证。 – goutham 2010-12-23 09:36:09

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' 
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" 
3

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

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