summaryrefslogtreecommitdiff
path: root/test/base
diff options
context:
space:
mode:
authorMike Bayer <mike_mp@zzzcomputing.com>2016-01-28 15:01:31 -0500
committerMike Bayer <mike_mp@zzzcomputing.com>2016-01-28 15:01:31 -0500
commit8a1e619fb20df1be6ad2e0c563e451e17eb17628 (patch)
treeba0d687981e3b079bc08de1a58d21514ce302d0b /test/base
parent086ad9ce6413e73f93506523d4eb8e23710443dc (diff)
downloadsqlalchemy-8a1e619fb20df1be6ad2e0c563e451e17eb17628.tar.gz
- revert the change first made in a6fe4dc, as we are now generalizing
the warning here to all safe_reraise() cases in Python 2. - Revisiting :ticket:`2696`, first released in 1.0.10, which attempts to work around Python 2's lack of exception context reporting by emitting a warning for an exception that was interrupted by a second exception when attempting to roll back the already-failed transaction; this issue continues to occur for MySQL backends in conjunction with a savepoint that gets unexpectedly lost, which then causes a "no such savepoint" error when the rollback is attempted, obscuring what the original condition was. The approach has been generalized to the Core "safe reraise" function which takes place across the ORM and Core in any place that a transaction is being rolled back in response to an error which occurred trying to commit, including the context managers provided by :class:`.Session` and :class:`.Connection`, and taking place for operations such as a failure on "RELEASE SAVEPOINT". Previously, the fix was only in place for a specific path within the ORM flush/commit process; it now takes place for all transational context managers as well. fixes #2696
Diffstat (limited to 'test/base')
-rw-r--r--test/base/test_utils.py34
1 files changed, 33 insertions, 1 deletions
diff --git a/test/base/test_utils.py b/test/base/test_utils.py
index 6d162ff4d..53dbc12f9 100644
--- a/test/base/test_utils.py
+++ b/test/base/test_utils.py
@@ -3,7 +3,7 @@ import sys
from sqlalchemy import util, sql, exc, testing
from sqlalchemy.testing import assert_raises, assert_raises_message, fixtures
-from sqlalchemy.testing import eq_, is_, ne_, fails_if, mock
+from sqlalchemy.testing import eq_, is_, ne_, fails_if, mock, expect_warnings
from sqlalchemy.testing.util import picklers, gc_collect
from sqlalchemy.util import classproperty, WeakSequence, get_callable_argspec
from sqlalchemy.sql import column
@@ -2192,6 +2192,38 @@ class ReraiseTest(fixtures.TestBase):
if testing.requires.python3.enabled:
is_(moe.__cause__, me)
+ @testing.requires.python2
+ def test_safe_reraise_py2k_warning(self):
+ class MyException(Exception):
+ pass
+
+ class MyOtherException(Exception):
+ pass
+
+ m1 = MyException("exc one")
+ m2 = MyOtherException("exc two")
+
+ def go2():
+ raise m2
+
+ def go():
+ try:
+ raise m1
+ except:
+ with util.safe_reraise():
+ go2()
+
+ with expect_warnings(
+ "An exception has occurred during handling of a previous "
+ "exception. The previous exception "
+ "is:.*MyException.*exc one"
+ ):
+ try:
+ go()
+ assert False
+ except MyOtherException:
+ pass
+
class TestClassProperty(fixtures.TestBase):