[Zope-dev] Re: "hasattr" geddon
Shane Hathaway
shane at hathawaymix.org
Sat Jul 10 14:39:04 EDT 2004
On Saturday 10 July 2004 11:41 am, Tim Peters wrote:
> [Shane Hathaway]
> > when the real problem is ZODB? ZODB
> > should *not* be sensitive to the way the application handles
> > ConflictErrors. When a ConflictError (or ReadConflictError) occurs, the
> > transaction should fall into an "uncommitable" state. From this state,
> > you can only abort the transaction; any attempts to write an object or
> > commit cause another ConflictError.
>
> AFAIK, that is the way the current releases of ZODB work. I'm not
> sure what "write an object" means there, though. I think I know what
> "commit" means. The logic in Connection.commit() raises
> ReadConflictError upon an attempt to commit an object that previously
> suffered a conflict during the transaction. How does that differ from
> what you want?
Here is what often happens in Zope:
def setFoo(self, value):
try:
self.foo = value
except:
LOG("Oops", ERROR, "Some error happened", error=sys.exc_info())
self.change_count += 1
self.get_indexes().update(self)
Some piece of code has a legitimate reason to catch but log all exceptions.
Some other piece of code updates indexes. The database has now committed a
partial transaction. Even worse, this can happen within the indexes, making
the indexes inconsistent with themselves. Once a conflict error has occurred
on any object, the rest of the transaction is on shaky grounds.
> Guido doesn't agree; hoping that Python will change here is probably
> futile (Guido has said several times that hasattr() should never raise
> an exception, and that matches how it's always been documented and
> implemented).
That's unfortunate. Now I'm inclined to never use hasattr again. Can we
petition for "hasattr2" then? :-)
Shane
More information about the Zope-Dev
mailing list