[Zope] adding properties trough pythonscript
Andrew Langmead
alangmead at boston.com
Tue Oct 19 11:53:35 EDT 2004
On Oct 18, 2004, at 1:36 PM, Dieter Maurer wrote:
> Sean Hastings wrote at 2004-10-18 01:58 -0400:
>> I believe that "try: ... except:..." code is only really dangerous if
>> you do
>> not specify the type of Exceptions that will be caught.
>
> I believe you are wrong:
>
> Catching *ANY* exception can cause inconsistencies in persistent
> data.
>
> It does (almost surely) when the "try" block modified persistent
> state before the exception occurred (and you did not ensure that
> the transaction is aborted).
I have a large body of code written in the manner that Sean is
describing, and after some time maintaining it, I'm now starting to
lean towards what Dieter is saying.
I have a system with an automated data import subsystem (for import of
"wire feeds" and such) , an event channel alerting various subsystems
about new changes throughout the system, and a web page creation
subsystem that create special styles of pages and layout based on any
criteria that it can query from the surrounding environment (for
example, if it is creating a new page based on a politics story, it can
add a related items link list, etc.)
I've seen a few cases where the following happens,
* A new story comes into the system from the feeds subsystem.
* The feeds subsystem sends a "new content" message the event channel.
* The event channel invokes page creation subsystem creates a new
page. (doing a little "self._setObject( id, page );page = self._getOb(
id )" dance to get a wrapped object instance and at that point altering
the persistent state)
* The page creation system then starts adding items to the page. One of
them throws an exception, that is caught in the event channel that
invoked it.
The end result is a page that is missing some of its critical
components.
I'm starting to think that in this case, the code that handles the
event channel should be less specific, rather than more explicit about
the exceptions it should catch, along with a subtransaction abort and
commit for each message handler it invokes. ( I definitely don't think
the exception should bubble up any higher and abort the feeds import,
because the other content coming through the feeds may be more
important than this one story. Maybe lower into the page creation into
the page creation subsystem might give more control over the error
handling.)
It definitely doesn't help that Python's dynamic nature here makes it
very hard to predict which errors might be occurring. (for example, I
noticed that the date parsing code for the DateTime object in 2.8a now
gives a consistent exception for syntactically invalid input. Up to
now, you could get some odd mix of DateTime.DateTime.DateError,
DateTime.DateTime.TimeError, IndexError, KeyError, TypeError, or
whatever else may be wrong with the input. Specific try:except:s are
hard to develop when you have no specific enumeration of the errors
that might be emitted for any particular method. (Don't get my wrong
and take that as a condemnation of the python language as a whole. Its
just one of those things where the more possibilities that you have
before you, the more ways you can fail.)
More information about the Zope
mailing list