Python 中 BaseException 的子类化问题

Problem sub-classing BaseException in Python

提问人:Charles Anderson 提问时间:12/19/2008 更新时间:12/21/2008 访问量:5347

问:

我想创建自己的 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 会接受任何一组参数。另外,我应该如何通过“例外”。BaseException“对象转换为异常。BaseException 的构造函数?

例外 遗产

评论


答:

11赞 user3850 12/19/2008 #1

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

BaseException.__init__(self, mess)

引用教程中的一句话:

派生类中的重写方法实际上可能希望扩展,而不是简单地替换同名的基类方法。有一种直接调用基类方法的简单方法:只需调用 。这有时对客户也很有用。(请注意,仅当基类直接在全局作用域中定义或导入时,这才有效。BaseClassName.methodname(self, arguments)

正如 Tony Arkles 在文档中提到的,

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

所以你不应该继承,反正......BaseException

评论

0赞 Charles Anderson 12/19/2008
谢谢。这不是我第一次忘记在某个地方使用“自我”;我相信这不会是最后一次。
2赞 Matt Green 12/19/2008
这就是为什么我更喜欢使用 super() 而不是显式调用 init 方法。如果您忘记了 super() 的 self 参数,则会立即收到错误。
0赞 6/22/2017
在 Python 3 中,不再需要参数。super()
6赞 Tony Arkles 12/19/2008 #2

Hop 说得对。

顺便说一句,你真的不应该对 BaseException 进行子类化,你应该对 Exception 进行子类化。(除非你真的知道自己在做什么)