fn(self, default, multiparams, params)
try:
- try:
- conn = self.__connection
- except AttributeError:
- conn = self._revalidate_connection()
+ conn = self.__connection
+ except AttributeError:
+ conn = self._revalidate_connection()
+ try:
dialect = self.dialect
ctx = dialect.execution_ctx_cls._init_default(
dialect, self, conn)
a :class:`.ResultProxy`."""
try:
- try:
- conn = self.__connection
- except AttributeError:
- conn = self._revalidate_connection()
+ conn = self.__connection
+ except AttributeError:
+ conn = self._revalidate_connection()
+ try:
context = constructor(dialect, self, conn, *args)
except Exception as e:
self._handle_dbapi_exception(e,
@classmethod
def _handle_dbapi_exception_noconnection(
cls, e, dialect, engine, connection):
+
exc_info = sys.exc_info()
is_disconnect = dialect.is_disconnect(e, None, None)
from sqlalchemy import testing
from sqlalchemy.testing.mock import Mock, MagicMock
from sqlalchemy import event
+from sqlalchemy import select
dialect = None
)
@testing.requires.sqlite
- def test_handle_error_event_reconnect(self):
+ def test_handle_error_event_revalidate(self):
e = create_engine('sqlite://')
dbapi = MockDBAPI()
sqlite3 = e.dialect.dbapi
def handle_error(ctx):
assert ctx.engine is eng
assert ctx.connection is conn
+ assert isinstance(ctx.sqlalchemy_exception, exc.ProgrammingError)
raise MySpecialException("failed operation")
conn = eng.connect()
conn._revalidate_connection
)
+ @testing.requires.sqlite
+ def test_handle_error_event_implicit_revalidate(self):
+ e = create_engine('sqlite://')
+ dbapi = MockDBAPI()
+ sqlite3 = e.dialect.dbapi
+ dbapi.Error = sqlite3.Error,
+ dbapi.ProgrammingError = sqlite3.ProgrammingError
+
+ class MySpecialException(Exception):
+ pass
+
+ eng = create_engine('sqlite://', module=dbapi, _initialize=False)
+
+ @event.listens_for(eng, "handle_error")
+ def handle_error(ctx):
+ assert ctx.engine is eng
+ assert ctx.connection is conn
+ assert isinstance(ctx.sqlalchemy_exception, exc.ProgrammingError)
+ raise MySpecialException("failed operation")
+
+ conn = eng.connect()
+ conn.invalidate()
+
+ dbapi.connect = Mock(
+ side_effect=sqlite3.ProgrammingError("random error"))
+
+ assert_raises(
+ MySpecialException,
+ conn.execute, select([1])
+ )
+
@testing.requires.sqlite
def test_handle_error_custom_connect(self):
e = create_engine('sqlite://')