错误异常必须从BaseException派生,即使它确实如此(Python 2.7)

时间:2011-10-31 17:40:43

标签: python

以下代码(在Python 2.7.1下)出现了什么问题:

class TestFailed(BaseException):
    def __new__(self, m):
        self.message = m
    def __str__(self):
        return self.message

try:
    raise TestFailed('Oops')
except TestFailed as x:
    print x

当我运行它时,我得到:

Traceback (most recent call last):
  File "x.py", line 9, in <module>
    raise TestFailed('Oops')
TypeError: exceptions must be old-style classes or derived from BaseException, not NoneType

但我认为TestFailed确实派生自BaseException

4 个答案:

答案 0 :(得分:17)

__new__是一种需要返回实例的静态方法。

相反,请使用__init__方法:

>>> class TestFailed(Exception):
    def __init__(self, m):
        self.message = m
    def __str__(self):
        return self.message

>>> try:
    raise TestFailed('Oops')
except TestFailed as x:
    print x


Oops

答案 1 :(得分:17)

其他人已经向您展示了如何修复您的实现,但我觉得重要的是要指出您实现的行为已经是标准的Python异常行为,因此您的大多数代码都是完全的不必要。只需从Exception(适用于运行时异常的基类)派生,并将pass作为正文。

class TestFailed(Exception):
    pass

答案 2 :(得分:4)

使用__init__()代替__new__()来“初始化”类。在大多数情况下,不必覆盖__new__。在对象创建期间在__init__之前调用它。

另见Python's use of __new__ and __init__?

答案 3 :(得分:2)

__new__实现应返回该类的实例,但它当前正在返回None(默认情况下)。

但是,您似乎应该在此使用__init__,而不是__new__