开发者

How to raise exception if None value encountered in dict?

开发者 https://www.devze.com 2023-02-01 11:13 出处:网络
I want to raise a KeyError exception if the value returned is None, but the following 开发者_运维问答throws a SyntaxError: invalid syntax exception.

I want to raise a KeyError exception if the value returned is None, but the following 开发者_运维问答throws a SyntaxError: invalid syntax exception.

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

What's a simple way to get this working?


You're getting a SyntaxError because raise is a statement not an expression, so the or raise KeyError part doesn't make [syntactic] sense. One workaround is to put just that into a function like the following, which is only called if the looked-up value is something non-True, like None, 0, '', and [].

Caveat: Note that doing this is potentially confusing since what it effectively does is make the presence of any of those types of values appear to be as though the protocol key wasn't there even though technically it was...so you might want to consider deriving your own specialized exception class from one of the built-ins and then deal with those instead of (ab)using what KeyError normally means.

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!')


If you want it in one line you could always make a function:

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"


The try and except KeyError combination should work. What is not working for you?

And since this in continuation of your previous question, that was not working because you were using dict.get, which never throws up KeyError.

However, the code in this question will. And you don't need 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'


Why do you want to have an exception, if you're really using it like this? Just use .get() and check for None.

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


I think this is more along the lines of what you want. Please comment if you need it to change.

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

Hope this helps

0

精彩评论

暂无评论...
验证码 换一张
取 消