diff sat/memory/persistent.py @ 2644:e107089d6640

core (memory/persistent): better default value handling in LazyPersistentBinaryDict (don't jump to debugger in debug mode if value is not found)
author Goffi <goffi@goffi.org>
date Sun, 29 Jul 2018 18:44:49 +0200
parents 26edcf3a30eb
children 9702025f6dff
line wrap: on
line diff
--- a/sat/memory/persistent.py	Sun Jul 29 18:44:27 2018 +0200
+++ b/sat/memory/persistent.py	Sun Jul 29 18:44:49 2018 +0200
@@ -20,6 +20,7 @@
 from sat.core.i18n import _
 from sat.core.log import getLogger
 log = getLogger(__name__)
+from twisted.python import failure
 
 
 class MemoryNotInitializedError(Exception):
@@ -199,26 +200,35 @@
     def __iter__(self):
         raise NotImplementedError
 
+    def _data2value(self, data, key):
+        try:
+            return data[key]
+        except KeyError as e:
+            # we return a Failure here to avoid the jump
+            # into debugger in debug mode.
+            raise failure.Failure(e)
+
     def __getitem__(self, key):
         """get the value as a Deferred"""
-        d = self.storage.getPrivates(self.namespace, keys=[key], binary=self.binary, profile=self.profile)
-        d.addCallback(lambda data: data[key])
+        d = self.storage.getPrivates(self.namespace, keys=[key], binary=self.binary,
+                                     profile=self.profile)
+        d.addCallback(self._data2value, key)
         return d
 
     def __setitem__(self, key, value):
-        self.storage.setPrivateValue(self.namespace, key, value, self.binary, self.profile)
+        self.storage.setPrivateValue(self.namespace, key, value, self.binary,
+                                     self.profile)
 
     def __delitem__(self, key):
         self.storage.delPrivateValue(self.namespace, key, self.binary, self.profile)
 
-    def _valueOrDefault(self, value, default):
-        if value is None:
-            return default
-        return value
+    def _defaultOrException(self, failure_, default):
+        failure_.trap(KeyError)
+        return default
 
     def get(self, key, default=None):
         d = self.__getitem__(key)
-        d.addCallback(self._valueOrDefault)
+        d.addErrback(self._defaultOrException, default=default)
         return d
 
     def setdefault(self, key, default):