summaryrefslogtreecommitdiff
path: root/lib/sqlalchemy/ext/indexable.py
diff options
context:
space:
mode:
authorMike Bayer <mike_mp@zzzcomputing.com>2020-02-29 14:40:45 -0500
committerMike Bayer <mike_mp@zzzcomputing.com>2020-03-02 17:24:19 -0500
commit57dc36a01b2b334a996f73f6a78b3bfbe4d9f2ec (patch)
tree77cbb0199ca91be3b0816e3a5bd4c217e36a7d1b /lib/sqlalchemy/ext/indexable.py
parent649de79950dcf952d7a44069faf36925c23c4e63 (diff)
downloadsqlalchemy-57dc36a01b2b334a996f73f6a78b3bfbe4d9f2ec.tar.gz
Ensure all nested exception throws have a cause
Applied an explicit "cause" to most if not all internally raised exceptions that are raised from within an internal exception catch, to avoid misleading stacktraces that suggest an error within the handling of an exception. While it would be preferable to suppress the internally caught exception in the way that the ``__suppress_context__`` attribute would, there does not as yet seem to be a way to do this without suppressing an enclosing user constructed context, so for now it exposes the internally caught exception as the cause so that full information about the context of the error is maintained. Fixes: #4849 Change-Id: I55a86b29023675d9e5e49bc7edc5a2dc0bcd4751
Diffstat (limited to 'lib/sqlalchemy/ext/indexable.py')
-rw-r--r--lib/sqlalchemy/ext/indexable.py15
1 files changed, 8 insertions, 7 deletions
diff --git a/lib/sqlalchemy/ext/indexable.py b/lib/sqlalchemy/ext/indexable.py
index f2e0501bb..6eb7e1185 100644
--- a/lib/sqlalchemy/ext/indexable.py
+++ b/lib/sqlalchemy/ext/indexable.py
@@ -223,7 +223,8 @@ The above query will render::
""" # noqa
from __future__ import absolute_import
-from sqlalchemy import inspect
+from .. import inspect
+from .. import util
from ..ext.hybrid import hybrid_property
from ..orm.attributes import flag_modified
@@ -301,9 +302,9 @@ class index_property(hybrid_property): # noqa
self.datatype = dict
self.onebased = onebased
- def _fget_default(self):
+ def _fget_default(self, err=None):
if self.default == self._NO_DEFAULT_ARGUMENT:
- raise AttributeError(self.attr_name)
+ util.raise_(AttributeError(self.attr_name), replace_context=err)
else:
return self.default
@@ -314,8 +315,8 @@ class index_property(hybrid_property): # noqa
return self._fget_default()
try:
value = column_value[self.index]
- except (KeyError, IndexError):
- return self._fget_default()
+ except (KeyError, IndexError) as err:
+ return self._fget_default(err)
else:
return value
@@ -337,8 +338,8 @@ class index_property(hybrid_property): # noqa
raise AttributeError(self.attr_name)
try:
del column_value[self.index]
- except KeyError:
- raise AttributeError(self.attr_name)
+ except KeyError as err:
+ util.raise_(AttributeError(self.attr_name), replace_context=err)
else:
setattr(instance, attr_name, column_value)
flag_modified(instance, attr_name)