遇到字典中的None值如何引发异常?
我想在返回的值是 None
时抛出一个 KeyError
异常,但是下面的代码却出现了 SyntaxError: invalid syntax
的错误。
try:
protocol = serverInfo_D['protocol'] or raise KeyError("protocol not present")
except KeyError:
print "Improper server config"
有没有简单的方法可以让这个正常工作呢?
5 个回答
2
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'
7
如果你想把它写成一行代码,你可以创建一个函数:
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"
11
你遇到了一个 SyntaxError
错误,因为 raise
是一个语句,而不是一个表达式,所以 or raise KeyError
这一部分在语法上是没有意义的。一个解决方法是把这部分放到一个函数里,只有在查找的值是一些不为真的东西时,比如 None
、0
、''
和 []
,这个函数才会被调用。
注意:这样做可能会让人困惑,因为它实际上会让这些值的存在看起来就像 protocol
这个键不存在一样,尽管从技术上讲它是存在的……所以你可能想考虑从一些 内置异常 中派生出你自己的特殊异常类,然后处理这些,而不是(滥用) KeyError
通常的含义。
def raise_KeyError(msg=''): raise KeyError(msg) # Doesn't return anything.
try:
protocol = serverInfo_D['protocol'] or raise_KeyError('protocol not present')
except KeyError:
print('Improper server config!')