2008-12-18 55 views
6

我想創造我自己的Python異常類,像這樣:問題子類BaseException在Python

class MyException(BaseException): 
    def __init__(self, errno, address): 
     if errno == 10048: 
      mess = str(address) + ' is already in use' 
     else: 
      mess = 'Unable to open ' + str(address) 
     BaseException.__init__(mess) 

但是當程序到了呼叫BaseException.__init__(),我得到這個回溯:

BaseException.__init__(mess) 
TypeError: descriptor '__init__' requires a 'exceptions.BaseException' object but received a 'str' 

我認爲BaseException會採用任何一組參數。另外,我應該如何將'exceptions.BaseException'對象傳遞給exceptions.BaseException的構造函數?

回答

10

你必須調用基類的方法與實例作爲第一個參數:

BaseException.__init__(self, mess) 

要從tutorial引證:

一種覆蓋方法在派生類可以在實際上是想擴展而不是簡單地替換同名的基類方法。有一種簡單的方法可以直接調用基類方法:只需撥打BaseClassName.methodname(self, arguments)即可。這對客戶也是偶爾有用的。 (請注意,如果基類的定義,或直接在全球範圍內導入時才能這樣。)

正如託尼Arkles和the documentation提到,

全內置,非系統從此類派生異常例外。所有用戶定義的例外情況也應來自[Exception]。

所以你不應該從BaseException,反正繼承...

+0

謝謝。這不是我第一次忘記在某處使用「自我」;我相信這不會是最後一次。 – 2008-12-18 17:14:35

+2

這就是爲什麼我更喜歡使用super()來顯式調用__init__方法。如果你忘記super()的自變量,你會立即得到一個錯誤。 – 2008-12-18 17:16:01

6

跳具有它的權利。作爲一個方面說明,你真的不應該繼承BaseException,你應該繼承Exception而不是Subclass。 (除非你真的知道你在做什麼)