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

Jim Fulton <[email protected]>
Newsgroups gmane.comp.python.zope.zodb.cvs
Message-ID <20100419215637.2C05D9418C__34676.750310655$1271714206$gmane$org@cvs.zope.org>
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):
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.