捕获SQLAlchemy异常

76

我可以用哪个更高级别的异常来捕获SQLAlchemy异常?

>>> from sqlalchemy import exc
>>> dir(exc)
['ArgumentError', 'CircularDependencyError', 'CompileError', 'ConcurrentModificationError', 'DBAPIError', 'DataError', 'DatabaseError', 'DisconnectionError', 'FlushError', 'IdentifierError', 'IntegrityError', 'InterfaceError', 'InternalError', 'InvalidRequestError', 'NoReferenceError', 'NoReferencedColumnError', 'NoReferencedTableError', 'NoSuchColumnError', 'NoSuchTableError', 'NotSupportedError', 'OperationalError', 'ProgrammingError', 'SADeprecationWarning', 'SAPendingDeprecationWarning', 'SAWarning', 'SQLAlchemyError', 'SQLError', 'TimeoutError', 'UnboundExecutionError', 'UnmappedColumnError', '__builtins__', '__doc__', '__file__', '__name__', '__package__']
>>> 
3个回答

104

为了捕获 SQLAlchemy 抛出的任何异常:

from sqlalchemy import exc
db.add(user)
try:
  db.commit()
except exc.SQLAlchemyError:
  pass # do something intelligent here

请查看 help(sqlalchemy.exc) 和 help(sqlalchemy.orm.exc) 获取 sqlalchemy 可能会引发的异常列表。


db.add(user)也放在try块中是有意义的。 - user2340939

79

源代码中可以看到:

基础异常类为SQLAlchemyError


1
你可能需要使用两个异常类。由于DBAPI异常引起的异常都是DBAPIError的子类。http://docs.sqlalchemy.org/en/latest/core/exceptions.html#sqlalchemy.exc.SQLAlchemyError - Wes
11
DBAPIErrorStatementError的子类,而StatementError则是SQLAlchemyError的子类。因此,只捕获SQLAlchemyError就可以了。 - stephan

7

根据您使用的SQLAlchemy版本(例如1.0.4),您可能需要做更多工作才能获得基础SQLAlchemyError类:

from flask.ext.sqlalchemy import exc
exceptions = exc.sa_exc

try:
    my_admin = user_models.User('space cadet', active=True)
    db.session.add(my_admin)
    db.session.commit()
except exceptions.SQLAlchemyError:
    sys.exit("Encountered general SQLAlchemyError.  Call an adult!")

这是因为sqlalchemy.orm.exc现在有以下语句:

"""SQLAlchemy ORM exceptions."""
from .. import exc as sa_exc, util

2
这是 flask-ext-sqlalchemy 尝试包装异常的问题。如果您没有使用 Flask 扩展,您可以使用 sqlalchemy.exc 中的基本 SQLAlchemyError 捕获 orm 错误。 - cowbert

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接