2008-12-18 58 views
6

我想创造我自己的Python异常类,像这样:问题子类BaseException在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的构造函数?

回答

10

你必须调用基类的方法与实例作为第一个参数:

BaseException.__init__(self, mess) 

要从tutorial引证:

一种覆盖方法在派生类可以在实际上是想扩展而不是简单地替换同名的基类方法。有一种简单的方法可以直接调用基类方法:只需拨打BaseClassName.methodname(self, arguments)即可。这对客户也是偶尔有用的。 (请注意,如果基类的定义,或直接在全球范围内导入时才能这样。)

正如托尼Arkles和the documentation提到,

全内置,非系统从此类派生异常例外。所有用户定义的例外情况也应来自[Exception]。

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

+0

谢谢。这不是我第一次忘记在某处使用“自我”;我相信这不会是最后一次。 – 2008-12-18 17:14:35

+2

这就是为什么我更喜欢使用super()来显式调用__init__方法。如果你忘记super()的自变量,你会立即得到一个错误。 – 2008-12-18 17:16:01

6

跳具有它的权利。作为一个方面说明,你真的不应该继承BaseException,你应该继承Exception而不是Subclass。 (除非你真的知道你在做什么)