【问题标题】:The "correct" way to define an exception in Python without PyLint complaining在没有 PyLint 抱怨的情况下在 Python 中定义异常的“正确”方法
【发布时间】:2011-02-23 11:11:48
【问题描述】:

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

首先,最简单的方法:

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

我怎么能在没有任何警告的情况下做这么简单的事情?

【问题讨论】:

  • *lint 总是在警告方面犯错,因此会产生您并不真正关心的警告,并且可能会提示粗心的人做一些事情,例如添加未使用的方法来尝试关闭它。让任何 lint 不抱怨不是一个值得的目标,了解它的所有抱怨才是。

标签: python exception


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    当您调用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 前缀: {0}'.format(message)),但无论哪种方式,它都是一个很好的答案!
    【解决方案3】:

    您的第一种方法应该可行。我自己在 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会不会出现上述问题。

    【讨论】:

      猜你喜欢
      • 2017-03-29
      • 1970-01-01
      • 1970-01-01
      • 2015-07-11
      • 1970-01-01
      • 1970-01-01
      • 2011-08-05
      • 2015-08-01
      • 2014-09-03
      相关资源
      最近更新 更多