summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorndparker <ndparker@users.noreply.github.com>2014-09-23 23:28:11 +0200
committerndparker <ndparker@users.noreply.github.com>2014-09-23 23:28:11 +0200
commitce52dd9e3b71f2074d7821fe62803d4e0eefe512 (patch)
treef0f9356075b7d85469a98180d17a5e2c91c058e5
parent360477cc3af826b5056039b9a19ec3ecb2b94ede (diff)
downloadsqlalchemy-ce52dd9e3b71f2074d7821fe62803d4e0eefe512.tar.gz
improve exception vs. exit handling
-rw-r--r--lib/sqlalchemy/dialects/mssql/base.py2
-rw-r--r--lib/sqlalchemy/dialects/mysql/base.py4
-rw-r--r--lib/sqlalchemy/dialects/mysql/mysqlconnector.py2
-rw-r--r--lib/sqlalchemy/engine/base.py2
-rw-r--r--lib/sqlalchemy/orm/mapper.py2
-rw-r--r--lib/sqlalchemy/orm/state.py4
-rw-r--r--lib/sqlalchemy/pool.py8
-rw-r--r--lib/sqlalchemy/sql/elements.py2
-rw-r--r--lib/sqlalchemy/sql/schema.py4
-rw-r--r--lib/sqlalchemy/testing/provision.py10
-rw-r--r--lib/sqlalchemy/util/langhelpers.py6
11 files changed, 38 insertions, 8 deletions
diff --git a/lib/sqlalchemy/dialects/mssql/base.py b/lib/sqlalchemy/dialects/mssql/base.py
index ba3050ae5..ade2d00cb 100644
--- a/lib/sqlalchemy/dialects/mssql/base.py
+++ b/lib/sqlalchemy/dialects/mssql/base.py
@@ -846,6 +846,8 @@ class MSExecutionContext(default.DefaultExecutionContext):
"SET IDENTITY_INSERT %s OFF" %
self.dialect.identifier_preparer. format_table(
self.compiled.statement.table)))
+ except (SystemExit, KeyboardInterrupt):
+ raise
except:
pass
diff --git a/lib/sqlalchemy/dialects/mysql/base.py b/lib/sqlalchemy/dialects/mysql/base.py
index 7ccd59abb..0994e2416 100644
--- a/lib/sqlalchemy/dialects/mysql/base.py
+++ b/lib/sqlalchemy/dialects/mysql/base.py
@@ -2317,6 +2317,8 @@ class MySQLDialect(default.DefaultDialect):
# basic operations via autocommit fail.
try:
dbapi_connection.commit()
+ except (SystemExit, KeyboardInterrupt):
+ raise
except:
if self.server_version_info < (3, 23, 15):
args = sys.exc_info()[1].args
@@ -2329,6 +2331,8 @@ class MySQLDialect(default.DefaultDialect):
try:
dbapi_connection.rollback()
+ except (SystemExit, KeyboardInterrupt):
+ raise
except:
if self.server_version_info < (3, 23, 15):
args = sys.exc_info()[1].args
diff --git a/lib/sqlalchemy/dialects/mysql/mysqlconnector.py b/lib/sqlalchemy/dialects/mysql/mysqlconnector.py
index e51e80005..afa61d85b 100644
--- a/lib/sqlalchemy/dialects/mysql/mysqlconnector.py
+++ b/lib/sqlalchemy/dialects/mysql/mysqlconnector.py
@@ -103,6 +103,8 @@ class MySQLDialect_mysqlconnector(MySQLDialect):
'client_flags', ClientFlag.get_default())
client_flags |= ClientFlag.FOUND_ROWS
opts['client_flags'] = client_flags
+ except (SystemExit, KeyboardInterrupt):
+ raise
except:
pass
return [[], opts]
diff --git a/lib/sqlalchemy/engine/base.py b/lib/sqlalchemy/engine/base.py
index d2cc8890f..b3460c240 100644
--- a/lib/sqlalchemy/engine/base.py
+++ b/lib/sqlalchemy/engine/base.py
@@ -1135,6 +1135,8 @@ class Connection(Connectable):
per_fn = fn(ctx)
if per_fn is not None:
ctx.chained_exception = newraise = per_fn
+ except (SystemExit, KeyboardInterrupt):
+ raise
except Exception as _raised:
# handler raises an exception - stop processing
newraise = _raised
diff --git a/lib/sqlalchemy/orm/mapper.py b/lib/sqlalchemy/orm/mapper.py
index a59a38a5b..bd28975dd 100644
--- a/lib/sqlalchemy/orm/mapper.py
+++ b/lib/sqlalchemy/orm/mapper.py
@@ -2649,6 +2649,8 @@ def configure_mappers():
mapper._expire_memoizations()
mapper.dispatch.mapper_configured(
mapper, mapper.class_)
+ except (SystemExit, KeyboardInterrupt):
+ raise
except:
exc = sys.exc_info()[1]
if not hasattr(exc, '_configure_failed'):
diff --git a/lib/sqlalchemy/orm/state.py b/lib/sqlalchemy/orm/state.py
index 3c12fda1a..4756f1707 100644
--- a/lib/sqlalchemy/orm/state.py
+++ b/lib/sqlalchemy/orm/state.py
@@ -258,8 +258,8 @@ class InstanceState(interfaces.InspectionAttr):
try:
return manager.original_init(*mixed[1:], **kwargs)
except:
- manager.dispatch.init_failure(self, args, kwargs)
- raise
+ with util.safe_reraise():
+ manager.dispatch.init_failure(self, args, kwargs)
def get_history(self, key, passive):
return self.manager[key].impl.get_history(self, self.dict, passive)
diff --git a/lib/sqlalchemy/pool.py b/lib/sqlalchemy/pool.py
index bc9affe4a..0c162e984 100644
--- a/lib/sqlalchemy/pool.py
+++ b/lib/sqlalchemy/pool.py
@@ -441,8 +441,8 @@ class _ConnectionRecord(object):
try:
dbapi_connection = rec.get_connection()
except:
- rec.checkin()
- raise
+ with util.safe_reraise():
+ rec.checkin()
echo = pool._should_log_debug()
fairy = _ConnectionFairy(dbapi_connection, rec, echo)
rec.fairy_ref = weakref.ref(
@@ -962,8 +962,8 @@ class QueuePool(Pool):
try:
return self._create_connection()
except:
- self._dec_overflow()
- raise
+ with util.safe_reraise():
+ self._dec_overflow()
else:
return self._do_get()
diff --git a/lib/sqlalchemy/sql/elements.py b/lib/sqlalchemy/sql/elements.py
index 8ec0aa700..8e18a22fe 100644
--- a/lib/sqlalchemy/sql/elements.py
+++ b/lib/sqlalchemy/sql/elements.py
@@ -3491,6 +3491,8 @@ def _string_or_unprintable(element):
else:
try:
return str(element)
+ except (SystemExit, KeyboardInterrupt):
+ raise
except:
return "unprintable element %r" % element
diff --git a/lib/sqlalchemy/sql/schema.py b/lib/sqlalchemy/sql/schema.py
index d9fd37f92..9afc31be8 100644
--- a/lib/sqlalchemy/sql/schema.py
+++ b/lib/sqlalchemy/sql/schema.py
@@ -412,8 +412,8 @@ class Table(DialectKWArgs, SchemaItem, TableClause):
table.dispatch.after_parent_attach(table, metadata)
return table
except:
- metadata._remove_table(name, schema)
- raise
+ with util.safe_reraise():
+ metadata._remove_table(name, schema)
@property
@util.deprecated('0.9', 'Use ``table.schema.quote``')
diff --git a/lib/sqlalchemy/testing/provision.py b/lib/sqlalchemy/testing/provision.py
index 0bcdad959..64688d6b5 100644
--- a/lib/sqlalchemy/testing/provision.py
+++ b/lib/sqlalchemy/testing/provision.py
@@ -120,6 +120,8 @@ def _pg_create_db(cfg, eng, ident):
isolation_level="AUTOCOMMIT") as conn:
try:
_pg_drop_db(cfg, conn, ident)
+ except (SystemExit, KeyboardInterrupt):
+ raise
except:
pass
currentdb = conn.scalar("select current_database()")
@@ -131,6 +133,8 @@ def _mysql_create_db(cfg, eng, ident):
with eng.connect() as conn:
try:
_mysql_drop_db(cfg, conn, ident)
+ except (SystemExit, KeyboardInterrupt):
+ raise
except:
pass
conn.execute("CREATE DATABASE %s" % ident)
@@ -173,14 +177,20 @@ def _mysql_drop_db(cfg, eng, ident):
with eng.connect() as conn:
try:
conn.execute("DROP DATABASE %s_test_schema" % ident)
+ except (SystemExit, KeyboardInterrupt):
+ raise
except:
pass
try:
conn.execute("DROP DATABASE %s_test_schema_2" % ident)
+ except (SystemExit, KeyboardInterrupt):
+ raise
except:
pass
try:
conn.execute("DROP DATABASE %s" % ident)
+ except (SystemExit, KeyboardInterrupt):
+ raise
except:
pass
diff --git a/lib/sqlalchemy/util/langhelpers.py b/lib/sqlalchemy/util/langhelpers.py
index 76f85f605..75c6e7b46 100644
--- a/lib/sqlalchemy/util/langhelpers.py
+++ b/lib/sqlalchemy/util/langhelpers.py
@@ -490,6 +490,8 @@ def generic_repr(obj, additional_kw=(), to_inspect=None, omit_kwarg=()):
val = getattr(obj, arg, missing)
if val is not missing and val != defval:
output.append('%s=%r' % (arg, val))
+ except (SystemExit, KeyboardInterrupt):
+ raise
except:
pass
@@ -499,6 +501,8 @@ def generic_repr(obj, additional_kw=(), to_inspect=None, omit_kwarg=()):
val = getattr(obj, arg, missing)
if val is not missing and val != defval:
output.append('%s=%r' % (arg, val))
+ except (SystemExit, KeyboardInterrupt):
+ raise
except:
pass
@@ -1185,6 +1189,8 @@ def warn_exception(func, *args, **kwargs):
"""
try:
return func(*args, **kwargs)
+ except (SystemExit, KeyboardInterrupt):
+ raise
except:
warn("%s('%s') ignored" % sys.exc_info()[0:2])