问题在Python中对BaseException进行子类化

Cha*_*son 6 python inheritance exception

我想创建自己的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)
Run Code Online (Sandbox Code Playgroud)

但是当程序接到电话时BaseException.__init__(),我得到了这个追溯:

BaseException.__init__(mess)
TypeError: descriptor '__init__' requires a 'exceptions.BaseException' object but received a 'str'
Run Code Online (Sandbox Code Playgroud)

我认为BaseException将采用任何一组参数.另外,我应该如何将'exceptions.BaseException'对象传递给exceptions.BaseException的构造函数?

小智 10

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

BaseException.__init__(self, mess)
Run Code Online (Sandbox Code Playgroud)

引用教程:

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

如Tony Arkles所述并在文档中,

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

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

  • 这就是为什么我更喜欢使用super()而不是显式地调用__init__方法.如果您忘记了super()的self参数,则会立即收到错误. (2认同)

Ton*_*les 6

跳是对的.

作为旁注,你真的不应该是BaseException的子类,你应该是子类化Exception.(除非你真的知道你在做什么)