2011-11-28 75 views
17

當我的某個函數檢測到None時,如果要傳遞參數值,需要引發什麼「適當」異常類?例如:如果沒有遇到任何參數,則引發正常異常

def MyFunction(MyArg1, MyArg2): 

    if not MyArg2: 
      raise ?Error? 

我想我已經看到了TypeError這裏使用(這是真的,我收到NoneType其中一些其他類型的預期),但不罷工我很適合這個情況我認爲這個例外可以更明確。

+0

你根本不應該做這種參數檢查。只要讓它失敗的任何異常進一步下降。 (如果你真的*必須*這樣做,'TypeError'是正確的例外。添加一個解釋字符串,使其更具體。) –

+0

我可能會引發一個'TypeError',看看內置的python例外文檔:http://docs.python.org/library/exceptions.html –

+0

@Sven:我通常按照你的建議去做,但這是一個特殊情況,我希望完成這個檢查。 –

回答

29

Python中沒有「無效參數」或「空指針」內置異常。相反,大多數函數會引發TypeError(無效類型,例如NoneType)或ValueError(正確類型,但該值超出了接受域)。

如果你的函數需要一個特定類的對象,並且改爲None,那麼應該像你指出的那樣提高TypeError。在這種情況下,你應該檢查None明確,不過,因爲正確類型的對象可以評估爲布爾False是否實現__nonzero__/__bool__

if MyArg2 is None: 
    raise TypeError 

Python文檔

-1

只需使用斷言:

assert type(MyArg2) == int 

或者:

assert type(MyArg2) != None 

這將防止有人通過你的錯誤的類型,以及處理與無的問題。它會返回一個AssertionErroras per the docs.

+1

這完全違背了Python的鴨子打字精神。它對代碼的適用性施加了不必要的限制。 (不是我downvote,順便說一句) –

+1

@SvenMarnach嗯,我已經成功地使用它*因爲鴨子打字。也就是說,鴨子打字已經隱藏了*爲什麼有些失敗。如果你發現自己需要在開始之前說出這些,那麼斷言只是一個方便的方法。例如,用一個for循環在輸入變量上編寫一個函數。它被假定爲用於通配符的文件名列表。如果不是通過一個項目傳遞一個列表,而是傳遞一個包含glob字符的字符串,會發生什麼? –

+1

assert的問題在於它忽略了可以很好地處理整數的值(在本例中),包括長整數,浮點數(在很多情況下,例如'range()'),以及實現'__int__ ()'特殊的方法。如果你覺得你需要這樣的事情,更好的方法可能是在方法的早期嘗試強制整數變量,例如'MyArg2 = int(MyArg2)'。 – kindall

2

大多數蟒功能的提高TypeError如果None作爲參數傳遞。採取任何功能說chr(None),看到它提出TypeError

2

正如其他人所指出的,TypeErrorValueError很自然。如果它看起來不夠具體,那麼可以將這兩個例外中的哪一個劃分爲更適合的類別。這允許一致處理一大類函數的無效參數,同時也爲特定函數提供更多細節。