[Checkins] SVN: ZODB/branches/jim-exception-mess/src/ZODB/POSException.py Change the way exceptions are handled to try to provide cross-python

Jim Fulton jim at zope.com
Mon Apr 19 17:56:37 EDT 2010


Log message for revision 111149:
  Change the way exceptions are handled to try to provide cross-python
  compatibility.
  
  This turns out to be a bad idea, because we can get around
  cross-python exception compatibility problems by updating clients
  first.  Checking in for posterity. :)
  

Changed:
  U   ZODB/branches/jim-exception-mess/src/ZODB/POSException.py

-=-
Modified: ZODB/branches/jim-exception-mess/src/ZODB/POSException.py
===================================================================
--- ZODB/branches/jim-exception-mess/src/ZODB/POSException.py	2010-04-19 20:35:25 UTC (rev 111148)
+++ ZODB/branches/jim-exception-mess/src/ZODB/POSException.py	2010-04-19 21:56:36 UTC (rev 111149)
@@ -27,6 +27,8 @@
     s = reason and (": %s" % reason) or ""
     return "Undo error %s%s" % (oid_repr(oid), s)
 
+# The following is no longer used but should be kept, at least for a
+# while, for compatibility with ZODB 3.8 and 3.9 servers. :/
 def _recon(class_, state):
     err = class_.__new__(class_)
     err.__setstate__(state)
@@ -36,30 +38,25 @@
 class POSError(StandardError):
     """Persistent object system error."""
 
-    if sys.version_info[:2] == (2, 6):
-        # The 'message' attribute was deprecated for BaseException with
-        # Python 2.6; here we create descriptor properties to continue using it
-        def __set_message(self, v):
-            self.__dict__['message'] = v
+    def __reduce__(self):
+        try:
+            args = self.args
+        except AttributeError:
+            return self.__class__, (), self.__getstate__()
+        else:
+            if args:
+                return self.__class__, args
+            else:
+                # sigh. 
+                return self.__class__, (), self.__getstate__()
 
-        def __get_message(self):
-            return self.__dict__['message']
+    def __getstate__(self):
+        return self.__dict__.copy()
 
-        def __del_message(self):
-            del self.__dict__['message']
+    def __setstate__(self, v):
+        self.__dict__.clear()
+        self.__dict__.update(v)
 
-        message = property(__get_message, __set_message, __del_message)
-
-    if sys.version_info[:2] >= (2, 5):
-        def __reduce__(self):
-            # Copy extra data from internal structures
-            state = self.__dict__.copy()
-            if sys.version_info[:2] == (2, 5):
-                state['message'] = self.message
-            state['args'] = self.args
-
-            return (_recon, (self.__class__, state))
-
 class POSKeyError(POSError, KeyError):
     """Key not found in database."""
 
@@ -95,6 +92,7 @@
 
     def __init__(self, message=None, object=None, oid=None, serials=None,
                  data=None):
+
         if message is None:
             self.message = "database conflict error"
         else:
@@ -220,6 +218,7 @@
             ]
 
     def __init__(self, p1, p2, p3, reason):
+        POSError.__init__(self, p1, p2, p3, reason)
         self.p1 = p1
         self.p2 = p2
         self.p3 = p3
@@ -248,6 +247,7 @@
     """
 
     def __init__(self, Aoid, Boid):
+        POSError.__init__(self, Aoid, Boid)
         self.referer = Aoid
         self.missing = Boid
 
@@ -277,6 +277,7 @@
     """An attempt was made to undo a non-undoable transaction."""
 
     def __init__(self, reason, oid=None):
+        POSError.__init__(self, reason, oid)
         self._reason = reason
         self._oid = oid
 
@@ -289,6 +290,7 @@
     def __init__(self, errs):
         # provide a reason and oid for clients that only look at that
         UndoError.__init__(self, *errs[0])
+        POSError.__init__(self, errs)
         self._errs = errs
 
     def __str__(self):



More information about the checkins mailing list