2013-04-21 60 views
1

我在Github上創建了一個開源項目,我想確保我盡我所能使它變得健壯,穩定並且它的Pythonic。爲此,我有一個問題,當我期望在字典中存在一個密鑰並且它不包含時,我應該使用什麼樣的異常。KeyError是否適當的異常?

也就是說,調用函數會是這樣的:

def calling_func(): 
    my_dict = { 
     'value_1': 1, 
     'value_2': None, 
     'value_3': '3', 
    } 

    foo(my_dict) 

我的功能foo預計字典包含key(以及相應的value),value_4。在以下情況下籌集KeyError是否合適?

def foo(my_dict): 
    expected_keys = ['value_1', 'value_2', 'value_3', 'value_4'] 

    for key in expected_keys: 
     if key not in my_dict: 
      raise KeyError 

這似乎爲KeyError傳統使用的是這種用法的倒數。

我應該爲此創建自己的異常類型嗎?

class MissingKeyError(Exception): 
    pass 

還是有這個效果?

+0

是什麼給你的印象'KeyError'是相反的? – 2013-04-21 13:25:16

+0

@Martijn Pieters其實,現在我想起它在做什麼在邏輯上等同於一個'KeyError'。 – Rico 2013-04-21 13:34:52

回答

2

KeyError是合適的例外。

如果可能,請使用Python異常,特別是適用於第三方的API。這節省了進口和學習曲線。

您可以簡化代碼:

if not my_dict.viewkeys() >= set(expected_keys): 
    raise KeyError 

或簡單地訪問所有的按鍵:

for key in expected_keys: 
    my_dict[key] # test for presence early 

只是不考並讓這確實使用了重點培養異常的代碼。

+0

+1「只是[不]測試,並讓使用密鑰的代碼引發異常」 – 2013-04-21 13:29:56

+0

感謝您的簡化。這個實現是建立一個URL POST到第三方API並且不會處理丟失的密鑰 - 它只是嘔吐。 :( – Rico 2013-04-21 13:30:52