Python 使用现有实例的异常子类

Python 使用现有实例的异常子类,python,Python,有一个类似的问题,但if指的是“重新分类”,而我想要一个子类 假设我有一个Django/SQLAlchemy异常IntegrityError,我希望有一个名为AlreadyExists的子类,用于违反唯一约束的特殊情况: try: ... except IntegrityError as exc: if ('violates unique constraint ' '"customer_wish_customer_

有一个类似的问题,但if指的是“重新分类”,而我想要一个子类

假设我有一个Django/SQLAlchemy异常
IntegrityError
,我希望有一个名为
AlreadyExists
的子类,用于违反唯一约束的特殊情况:

    try:
         ...
    except IntegrityError as exc:
        if ('violates unique constraint '
                '"customer_wish_customer_product_unique"') in exc.message:
            raise AlreadyExists(exc)
我不想只做一个子类,因为
IntegrityError.\uuuu init\uuuu
有很多参数,我不想手动从现有的
IntegrityError
实例中提取这些参数,并将它们提供给父级
\uu init\uuu

所以我想出了以下代码:

class AlreadyExists(IntegrityError):

    def __new__(cls, sa_exc):
        sa_exc.__class__ = cls  # replace the class
        return sa_exc  # but do not create new object

    def __init__(self, *args):
        pass  # do nothing, as no new object was created

你对这个想法本身有什么看法?你能提出一个更好的实现方案吗?

这真的与
exc.\uuuu class\uuuu=AlreadyExists;raise exc
?有两个区别:1)每次要引发异常时都要重复代码。2) 这样
isinstance(exc,IntegrityError)=False
您确定(2)吗?你的新类仍然是一个子类。是的,关于(2)
AlreadyExists
是关于2的
IntegrityError
的一个子类——我的简单测试表明isinstance查看
\uu class\uuuuuuuuuuuuuuuuuuuuuuuuu属性(然后可能会在
\uuuuuu mro\uuuuuuuuuuuuuuuuuuuuuu>或
属性中查找类).  无论如何,我的提案将通过
isinstance
检查。-关于1,我不认为显式地设置类比调用一个令人困惑的类“构造函数”更像是重复的代码。(你的
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu。