2010-02-03 4 views
26

Was ist die Ausnahme auf der oberen Ebene, die ich SQLAlechy-Ausnahmen mit abfangen kann?Abfangen von SQLAlchemy-Ausnahmen

>>> 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__'] 
>>> 

Antwort

28

Von the source:

Die Basisausnahmeklasse ist SQLAlchemyError.

+0

Möglicherweise müssen Sie zwei Ausnahmeklassen verwenden. 'Ausnahmen, die als Ergebnis von DBAPI-Ausnahmen ausgelöst werden, sind alle Unterklassen von DBAPIError.' http://docs.sqlalchemy.org/en/latest/core/exceptions.html#sqlalchemy.exc.SQLAlchemyError – Wes

+1

@Wes:' DBAPIError' [ist eine Unterklasse von] (https://github.com/zzzeek/sqlalchemy/blob/master/lib/sqlalchemy/exc.py#L333) 'StatementError' welches seinerseits [ist eine Unterklasse von] (https: // github.com/zzzeek/sqlalchemy/blob/master/lib/sqlalchemy/exc.py#L280) 'SQLAlchemyError'. Also, nur "SQLAlchemyError" fangen sollte in Ordnung sein. – stephan

33

Um eine Ausnahme zu fangen SQLAlchemy wirft:

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

Siehe Hilfe (sqlalchemy.exc) und Hilfe (sqlalchemy.orm.exc) für eine Liste möglicher Ausnahmen, die sqlalchemy erhöhen können.

2

Je nach Ihrer Version von SQLAlchemy (zB 1.0.4), müssen Sie ein wenig mehr tun, um die Base- SQLAlchemyError Klasse zu erhalten:

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!") 

ist dies, weil sqlalchemy.orm.exc jetzt die Strophe hat:

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

Dies ist ein Problem mit der Art, wie flask-ext-sqlalchemy versucht, Ausnahmen zu umbrechen. Wenn Sie nicht die Flask-Erweiterung verwenden, können Sie die ORM-Fehler mit der Base 'SQLAlchemyError' aus' sqlalchemy.exc' einfach abfangen ... – cowbert