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