【问题标题】:Problem sub-classing BaseException in Python在 Python 中对 BaseException 进行子类化的问题
【发布时间】:2008-12-18 17:00:56
【问题描述】:

我想创建自己的 Python 异常类,如下所示:

class MyException(BaseException):
    def __init__(self, errno, address):
        if errno == 10048:
            mess = str(address) + ' is already in use'
        else:
            mess = 'Unable to open ' + str(address)
        BaseException.__init__(mess)

但是当程序调用BaseException.__init__()时,我得到了这个回溯:

BaseException.__init__(mess)
TypeError: descriptor '__init__' requires a 'exceptions.BaseException' object but received a 'str'

我认为 BaseException 可以接受任何参数集。另外,我应该如何将 'exceptions.BaseException' 对象传递给 exceptions.BaseException 的构造函数?

【问题讨论】:

    标签: python exception inheritance


    【解决方案1】:

    您必须以实例作为第一个参数来调用基类的方法:

    BaseException.__init__(self, mess)
    

    引用tutorial

    派生类中的重写方法实际上可能想要扩展而不是简单地替换同名的基类方法。有一个简单的方法可以直接调用基类方法:直接调用BaseClassName.methodname(self, arguments)。这有时对客户也很有用。 (请注意,这只适用于直接在全局范围内定义或导入基类的情况。)

    正如 Tony Arkles 在the documentation 中提到的,

    所有内置的、非系统退出的异常都派生自这个类。所有用户定义的异常也应该派生自 [Exception]。

    所以你不应该从BaseException继承,无论如何......

    【讨论】:

    • 谢谢。这不是我第一次忘记在某处使用“self”了。我相信这不会是最后一次。
    • 这就是为什么我更喜欢使用 super() 而不是显式调用 init 方法。如果你忘记了 super() 的 self 参数,你会立即得到一个错误。
    • 在 Python 3 中 super() 不再需要参数。
    【解决方案2】:

    hop 说得对。

    附带说明一下,您真的不应该继承 BaseException,而应该继承 Exception。 (除非你真的很清楚自己在做什么)

    【讨论】:

      猜你喜欢
      • 2011-07-23
      • 1970-01-01
      • 2012-01-01
      • 2011-02-05
      • 1970-01-01
      • 1970-01-01
      • 2021-04-03
      • 2016-02-20
      相关资源
      最近更新 更多