2010-05-24 35 views
19

我想在Python 2.6中定義我自己的(非常簡單的)異常類,但不管我如何做,我得到一些警告。在Python中定義異常沒有PyLint的「正確」方法抱怨

首先,最簡單的方法:

class MyException(Exception): 
    pass 

這工作,但打印出在運行時發出警告:DeprecationWarning: BaseException.message has been deprecated as of Python 2.6 OK,所以這是沒有辦法的辦法。我然後嘗試:

class MyException(Exception): 
    def __init__(self, message): 
     self.message = message 

這也適用,但PyLint報告警告:W0231: MyException.__init__: __init__ method from base class 'Exception' is not called。所以我試圖稱它爲:

class MyException(Exception): 
    def __init__(self, message): 
     super(Exception, self).__init__(message) 
     self.message = message 

這也適用!但現在PyLint報告了一個錯誤:E1003: MyException.__init__: Bad first argument 'Exception' given to super class

我該怎麼做這麼簡單的事情,沒有任何警告?

+4

'* lint'總是在警告方面犯了錯誤,因此會產生警告,您並不真正關心,並且可能會提示不謹慎的事情,例如添加未使用的方法來嘗試關閉它。讓任何皮棉不抱怨不是一個有價值的目標,理解它的所有抱怨是。 – msw 2010-05-24 23:45:40

回答

28

當你調用super,你需要的子類/派生類作爲第一個參數,而不是主/基類。

從Python的在線文檔:

class C(B): 
    def method(self, arg): 
     super(C, self).method(arg) 

所以,你的異常將會被定義如下:

class MyException(Exception): 
    def __init__(self, message): 
     super(MyException, self).__init__(message) 
     self.message = message 
+1

啊,是的,當然! – EMP 2010-05-25 00:22:05

+0

啊,這是一個活的保護程序,雖然我甚至會進一步說明這個例子,以顯示這樣的事情,你可以這樣做:super(MyException,self).__ init __('MyException prefix:{0}'.format消息)),但無論哪種方式,這是一個很好的答案! – lpapp 2013-10-21 17:50:23

6

好的,我想我明白了。這似乎讓pylint的幸福:

class MyException(Exception): 
    def __init__(self, message): 
     Exception.__init__(self, message) 
     self.message = message 
0

你的第一種方法應該工作。我在Python 2.6.5中一直使用它自己。然而,我不使用「消息」屬性;也許這就是你在第一個例子中得到運行時警告的原因。

下面的代碼,例如,運行沒有任何錯誤或運行時警告:

class MyException(Exception): 
    pass 

def thrower(): 
    error_value = 3 
    raise MyException("My message", error_value) 
    return 4 

def catcher(): 
    try: 
     print thrower() 
    except MyException as (message, error_value): 
     print message, "error value:", error_value 

結果:

>>> catcher() 
My message error value: 3 

我不知道是否會pylint的有問題與上述。

相關問題