如果返回的值为KeyError
,我想提出None
异常,但以下内容会引发SyntaxError: invalid syntax
异常。
try:
protocol = serverInfo_D['protocol'] or raise KeyError("protocol not present")
except KeyError:
print "Improper server config"
这是一种简单的方法吗?
答案 0 :(得分:6)
你得到一个SyntaxError
因为raise
是一个语句而不是一个表达式,所以or raise KeyError
部分不会使[语法]有意义。一种解决方法是将其放入如下所示的函数中,只有在查找的值为非True的情况下才会调用此函数,例如None
,0
,''
和[]
。
警告:请注意,执行此操作可能会造成混淆,因为它实际上会使任何这些类型的值的存在看起来好像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)
try
和except 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")
希望这有帮助