在Python中定义异常而不让PyLint报错的“正确”方式

31 投票
3 回答
17242 浏览
提问于 2025-04-15 23:06

我想在Python 2.6中定义一个自己的(非常简单的)异常类,但无论我怎么做,总是会收到一些警告。

首先,最简单的方法是:

class MyException(Exception):
    pass

这个方法可以用,但在运行时会打印出一个警告:弃用警告:BaseException.message在Python 2.6中已被弃用。好吧,这显然不是正确的方法。接着我尝试了:

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

这个方法也可以用,但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__: 给超类的第一个参数'Exception'不正确

我到底该怎么做才能做到这么简单的事情而没有任何警告呢?

3 个回答

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对上面的代码会不会有问题。

7

好的,我想我搞明白了。这段代码似乎能让PyLint满意:

class MyException(Exception):
    def __init__(self, message):
        Exception.__init__(self, message)
        self.message = message
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

撰写回答