可以在Python中声明抽象异常吗?

可以在Python中声明抽象异常吗?,python,oop,python-2.7,Python,Oop,Python 2.7,我想在Python中声明一个用户定义异常的层次结构。但是,我希望我的顶级用户定义类(TransactionException)是抽象的。也就是说,我打算TransactionException指定需要其子类定义的方法。但是,TransactionException不应被实例化或引发 我有以下代码: from abc import ABCMeta, abstractmethod class TransactionException(Exception): __metaclass__ =

我想在Python中声明一个用户定义异常的层次结构。但是,我希望我的顶级用户定义类(
TransactionException
)是抽象的。也就是说,我打算
TransactionException
指定需要其子类定义的方法。但是,
TransactionException
不应被实例化或引发

我有以下代码:

from abc import ABCMeta, abstractmethod

class TransactionException(Exception):
    __metaclass__ = ABCMeta

    @abstractmethod
    def displayErrorMessage(self):
        pass
但是,上面的代码允许我实例化
TransactionException

a = TransactionException()
在这种情况下,
a
没有意义,应该绘制一个异常。下面的代码删除了
TransactionException
Exception
的子类这一事实

from abc import ABCMeta, abstractmethod

class TransactionException():
    __metaclass__ = ABCMeta

    @abstractmethod
    def displayErrorMessage(self):
        pass
这段代码正确地禁止实例化,但现在我不能提出
TransactionException
的子类,因为它不再是
异常

可以在Python中定义抽象异常吗?如果是,怎么做?若否,原因为何


注意:我使用的是Python2.7,但我很乐意接受Python2.x或Python3.x的答案。

Alex Martelli对此主题有一个很好的答案。本质上,它归结为各种基类(
对象
列表
,我想,
异常
)的对象初始值设定项(
初始化
)在存在抽象方法时的行为

class TransactionException(Exception):

    def __init__(self, *args, **kwargs):
        raise NotImplementedError('you should not be raising this')


class EverythingLostException(TransactionException):

    def __init__(self, msg):
        super(TransactionException, self).__init__(msg)


try:
    raise EverythingLostException('we are doomed!')
except TransactionException:
    print 'check'

try:
    raise TransactionException('we are doomed!')
except TransactionException:
    print 'oops'
当一个抽象类从
对象继承时(这是默认值,如果没有给出其他基类),它的
\uuuu init\uuuuu
方法被设置为
对象的方法,该方法在检查是否所有抽象方法都已实现时执行繁重的工作

如果抽象类从另一个基类继承,它将获得该类的“
\uuuu init\uuu
方法。其他类,如
列表
异常
,似乎不检查抽象方法实现,这就是为什么允许实例化它们


另一个答案提供了建议的解决方法。当然,您还有一个选择,就是简单地接受抽象类将是可实例化的,并尝试阻止它。

严格地说,您仍然可以实例化
TransactionException
,您只是无法初始化它(
exc=TransactionException.\uuuuuuuu新的(TransactionException)
)。但这可能是OP想要的精神。