2010-12-23 85 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"