我想捕获特定的异常,例如UniqueViolation
关于 sqlalchemy。
但是 sqlalchemy 只能通过以下方式抛出异常IntegrityError
.
所以我用下面的代码捕获了特定的异常。
except sqlalchemy.exc.IntegrityError as e:
from psycopg2 import errors
if isinstance(e.orig, errors.UniqueViolation):
pass
elif isinstance(e.orig, errors.ForeignKeyViolation):
pass
但看起来并不优雅。
我不想使用 if 语句只是捕获特定的异常名称。
有什么办法可以解决这个问题吗?
Thanks.
您可以从以下位置重新引发原始异常except
阻止并捕获您感兴趣的任何特定类型:
import sqlalchemy
import psycopg2
from psycopg2 import errors
try:
raise sqlalchemy.exc.IntegrityError("INSERT INTO table (col1) VALUES (?)", (1,), errors.IntegrityConstraintViolation)
except sqlalchemy.exc.IntegrityError as sqla_error:
try:
raise sqla_error.orig
except (errors.UniqueViolation, errors.ForeignKeyViolation):
pass
这将引发的所有子类psycopg2.IntegrityError
以外psycopg2.error.UniqueViolation
and psycopg2.errors.ForeignKeyViolation
.
正如 SuperShoot 的回答所述,这将导致嵌套异常。
您可以通过以下方式抑制异常上下文:
raise sqla_error.orig from None
然而,这可能会削弱回溯的表达能力。
如果你想回退到 SQLAlchemy IntegrityError 如果.orig
不是您感兴趣的类型,您可以通过将其添加到上面来再次提出它:
except psycopg2.IntegrityError:
raise sqla_error from None
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)