在Python中定义异常的“正确”方式,避免触发PyLint警告

31

我正在尝试在Python 2.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__方法来自基类'Exception'没有被调用。因此我尝试调用它:

这也是可行的,但是PyLint会报一个警告:W0231: MyException.__init__: 没有调用基类 'Exception' 的 __init__ 方法。因此,我试着调用它:

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

到底该如何做才能不出现任何警告?


7
*lint 一直倾向于发出警告,因此会生成您并不真正关心的警告,并可能促使粗心大意的人做出添加未使用的方法等操作以尝试消除它的警告。让任何 lint 不再抱怨并不是一个值得追求的目标,了解它所有的警告才是关键。 - msw
@msw:任何未解决的警告都是可能掩盖有趣信息的噪音。但总是可以使用 noqa/# pylint: disable=line-too-long 来消除纯粹的噪音。而调用基类的 __init__ 通常是一个好主意。 - ted
3个回答

45

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

啊,这真是救命稻草啊!虽然我会进一步举例来展示你可以这样做:super(MyException, self).init('MyException prefix: {0}'.format(message)),但无论如何,这都是一个很好的答案! - László Papp

7

好的,我想我弄明白了。这似乎可以让PyLint感到满意:

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

0

你的第一种方法应该是可行的。我自己在Python 2.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

我不知道PyLint是否会对上面的代码有问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接