提问人:Charles Anderson 提问时间:12/19/2008 更新时间:12/21/2008 访问量:5347
Python 中 BaseException 的子类化问题
Problem sub-classing BaseException in Python
问:
我想创建自己的 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 进行子类化。(除非你真的知道自己在做什么)
评论