2009-12-26 52 views

回答

13

請記住,您可以繼承Python的內置異常類(並且TypeError肯定會是在此引發的正確的內置異常類 - 這就是Python在正常情況下參數個數不匹配時引發的內容在簽名中沒有*a**k表格的情況)。我喜歡有每個包定義自己class Error(Exception),然後具體的例外根據需要可以繁殖繼承適當的,例如:

class WrongNumberOfArguments(thispackage.Error, TypeError): 

然後,我會raise WrongNumberOfArguments時,我發現這樣的問題的情況。

這樣,任何一個來電者是誰知道這個包可以趕上​​thispackage.Error,如果他們需要處理特定的軟件包的任何錯誤,而其他主叫方呼叫(調用鏈大概得更高)仍趕上更通用TypeError以處理任何錯誤,例如「函數調用中使用的參數數量錯誤」。

+0

這是很好地使用多重繼承的一個很好的例子。謝謝。 –

3

我會做一個具體的。你可以捕捉它,並處理特定的異常,因爲它是你創建的一個特殊情況:)

4

如果(如你在其中一條評論中所說)這是一個程序員錯誤,那麼你可以引發AssertionError:

def two(**kwargs): 
    assert len(kwargs) == 2, "Please only provide two args" 

順便說一句,如果你只有三個命名參數,** kwargs似乎是一個奇怪的方式來做到這一點。更自然的可能是:

def two(a=None, b=None, c=None): 
    pass 
0

我會用一個ValueError,或者其子類:當一個內置操作或者函數接收具有正確的類型,但不恰當的值的參數,而且情況是「募集沒有被更精確的異常所描述,如IndexError。「

如果您將所有參數視爲單個元組,則在需要精確爲2時傳遞3或1的值在技術上將是不適當的值......至少在我看來! :)

11

爲什麼不只是做什麼python呢?

>>> abs(1, 2, 3) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
TypeError: abs() takes exactly one argument (3 given) 
0

我推薦一個自定義異常。像這樣:

class NeedExactlyTwo(ValueError): 
    pass 

然後你可以在你的代碼中raise NeedExactlyTwo

請務必在文檔字符串中爲您的函數記錄此信息。

相關問題