2012-10-12 27 views
1

考慮區分類型錯誤由錯誤的函數參數觸發和函數體觸發

try: 
    f(*args, **kwargs) 
except TypeError: 
    print "doh!" 

在這種情況下,這樣做的原因可能TypeError函數參數中,如出現問題f() got an unexpected keyword argument 'b'。然而,TypeError也可能由於功能體本身內的問題而產生,例如, list indices must be integers, not str

我不知道在Python 2中是否有一個可靠的方法來區分兩種情況(參數問題,身體問題)。也許一些基於裝飾者的方法?

推理:我正在實施另一種工作制度。工作基本上是一個功能。這個函數的參數可以從用戶輸入中派生出來,並通過JSON序列化/反序列化過程。我希望系統爲系統的用戶提供儘可能準確的錯誤信息。因此,我希望控制作業執行的實體能夠區分TypeError的兩個來源。此外,我認爲這本身就是一個非常有趣的問題。

我意識到https://stackoverflow.com/questions/12712475/how-to-check-if-a-typeerror-raised-from-mismatched-function-arguments基本上是這個問題的重複。然而,那裏的評論討論停止了,沒有任何答案。我希望在這種情況下可以打開我自己的問題並重新解決問題。

+0

我認爲唯一的解決方案是解析錯誤信息或檢查'sys'模塊中的異常信息。 無論如何,我認爲你應該能夠避免這種情況。如果使用正確的參數調用該函數,則不應引發「TypeError」。在大多數邊角情況下,可能會使用「ValueError」。 – Bakuriu

回答

1

所以我不會這樣做,因爲你想傳播的內部錯誤是編碼錯誤,而不是實際的異常,需要被捕獲。

這就是說。我會反思被拋出的錯誤,並沉默其中,傳播另一個錯誤。

0

我敢肯定你能解決這個問題的方式如下:爲在體類型錯誤

步驟1.創建一個自定義異常(如AwfulTypeError)通過繼承Exception

class AwfulTypeError(Exception): 
    pass # Or do something if necessary 

第2步:包裝你整個函數體tryexcept TypeError該塊:

def my_function(a, b, c): 
    try: 
     # Some operations you need to do 
     return (a + b) * c 
    except TypeError as e: 
     # We're doing stuff here in the next step 

第3步:在醒目原TypeError例外,再提高它作爲AwfulTypeError異常已指定前:

except TypeError as e: 
     raise AwfulTypeError(e) 

現在你能區分參數類型錯誤(仍爲TypeError)與體內TypeError(現在是AwfulTypeError類型)。

P.S.我更習慣於Python 3,所以如果我搞砸了Python的語法,請隨時通知我。