Python中定义异常的“正确”方式,而无需PyLint抱怨

2024-05-13 03:39:32 发布

您现在位置:Python中文网/ 问答频道 /正文

我正试图在Python2.6中定义自己的(非常简单的)异常类,但无论如何定义,我都会收到一些警告。

首先,最简单的方法:

class MyException(Exception):
    pass

这是有效的,但是在运行时会打印出一个警告:DeprecationWarning: BaseException.message has been deprecated as of Python 2.6好的,所以不是这样的。然后我试着:

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

我怎么能做这么简单却没有任何警告的事?


Tags: 方法self警告message定义initdef报告
3条回答

你的第一条路应该行得通。在Python2.6.5中,我一直自己使用它。不过,我不使用“message”属性;也许这就是在第一个示例中获得运行时警告的原因。

例如,以下代码运行时没有任何错误或运行时警告:

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

我不知道派林特是否会对上述问题有意见。

好吧,我想我已经知道了。这似乎让皮林特很高兴:

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

调用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

相关问题 更多 >