summaryrefslogtreecommitdiff
path: root/lib/sqlalchemy
diff options
context:
space:
mode:
authorMike Bayer <mike_mp@zzzcomputing.com>2017-03-27 10:52:58 -0400
committerMike Bayer <mike_mp@zzzcomputing.com>2017-03-27 11:14:24 -0400
commitc0a224aba3d4e2a41f92a29f9d18c6cb9d09d61f (patch)
tree4c737f68b3a9f2430f3d1c17af8c202eb6dd9a27 /lib/sqlalchemy
parentf214f4d4f46de24008c63f2e034329a64f510833 (diff)
downloadsqlalchemy-c0a224aba3d4e2a41f92a29f9d18c6cb9d09d61f.tar.gz
Add safe_reraise() + warnings only to Connection._autorollback
Added an exception handler that will warn for the "cause" exception on Py2K when the "autorollback" feature of :class:`.Connection` itself raises an exception. In Py3K, the two exceptions are naturally reported by the interpreter as one occurring during the handling of the other. This is continuing with the series of changes for rollback failure handling that were last visited as part of :ticket:`2696` in 1.0.12. Change-Id: I600ba455a14ebaea27c6189889181f97c632f179 Fixes: #3946
Diffstat (limited to 'lib/sqlalchemy')
-rw-r--r--lib/sqlalchemy/engine/base.py3
-rw-r--r--lib/sqlalchemy/testing/assertions.py9
-rw-r--r--lib/sqlalchemy/util/langhelpers.py8
3 files changed, 14 insertions, 6 deletions
diff --git a/lib/sqlalchemy/engine/base.py b/lib/sqlalchemy/engine/base.py
index 0334d2d7a..f680edada 100644
--- a/lib/sqlalchemy/engine/base.py
+++ b/lib/sqlalchemy/engine/base.py
@@ -1383,7 +1383,8 @@ class Connection(Connectable):
if not self._is_disconnect:
if cursor:
self._safe_close_cursor(cursor)
- self._autorollback()
+ with util.safe_reraise(warn_only=True):
+ self._autorollback()
if newraise:
util.raise_from_cause(newraise, exc_info)
diff --git a/lib/sqlalchemy/testing/assertions.py b/lib/sqlalchemy/testing/assertions.py
index 0244f18a9..884556345 100644
--- a/lib/sqlalchemy/testing/assertions.py
+++ b/lib/sqlalchemy/testing/assertions.py
@@ -10,11 +10,11 @@ from __future__ import absolute_import
from . import util as testutil
from sqlalchemy import pool, orm, util
from sqlalchemy.engine import default, url
-from sqlalchemy.util import decorator
+from sqlalchemy.util import decorator, compat
from sqlalchemy import types as sqltypes, schema, exc as sa_exc
import warnings
import re
-from .exclusions import db_spec, _is_excluded
+from .exclusions import db_spec
from . import assertsql
from . import config
from .util import fail
@@ -118,7 +118,8 @@ def uses_deprecated(*messages):
@contextlib.contextmanager
-def _expect_warnings(exc_cls, messages, regex=True, assert_=True):
+def _expect_warnings(exc_cls, messages, regex=True, assert_=True,
+ py2konly=False):
if regex:
filters = [re.compile(msg, re.I | re.S) for msg in messages]
@@ -147,7 +148,7 @@ def _expect_warnings(exc_cls, messages, regex=True, assert_=True):
with mock.patch("warnings.warn", our_warn):
yield
- if assert_:
+ if assert_ and (not py2konly or not compat.py3k):
assert not seen, "Warnings were not seen: %s" % \
", ".join("%r" % (s.pattern if regex else s) for s in seen)
diff --git a/lib/sqlalchemy/util/langhelpers.py b/lib/sqlalchemy/util/langhelpers.py
index 41fed882d..9ca19f138 100644
--- a/lib/sqlalchemy/util/langhelpers.py
+++ b/lib/sqlalchemy/util/langhelpers.py
@@ -49,6 +49,11 @@ class safe_reraise(object):
"""
+ __slots__ = ('warn_only', '_exc_info')
+
+ def __init__(self, warn_only=False):
+ self.warn_only = warn_only
+
def __enter__(self):
self._exc_info = sys.exc_info()
@@ -57,7 +62,8 @@ class safe_reraise(object):
if type_ is None:
exc_type, exc_value, exc_tb = self._exc_info
self._exc_info = None # remove potential circular references
- compat.reraise(exc_type, exc_value, exc_tb)
+ if not self.warn_only:
+ compat.reraise(exc_type, exc_value, exc_tb)
else:
if not compat.py3k and self._exc_info and self._exc_info[1]:
# emulate Py3K's behavior of telling us when an exception