代码之家  ›  专栏  ›  技术社区  ›  EMP

在没有pylint抱怨的情况下用python定义异常的“正确”方法

  •  25
  • EMP  · 技术社区  · 14 年前

    我正试图在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__ method from base class 'Exception' is not called . 所以我试着叫它:

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

    这也行!但是现在皮林报告了一个错误: E1003: MyException.__init__: Bad first argument 'Exception' given to super class

    我怎么能不经警告就做这么简单的事呢?

    3 回复  |  直到 14 年前
        1
  •  35
  •   Dustin    14 年前

    当你打电话 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
    
        2
  •  7
  •   EMP    14 年前

    好吧,我想我明白了。这似乎让皮林高兴:

    class MyException(Exception):
        def __init__(self, message):
            Exception.__init__(self, message)
            self.message = message
    
        3
  •  0
  •   Peter Milley    14 年前

    你的第一条路应该管用。在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
    

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