[Zope-dev] [Bug] Zope's transaction behaviour flawed
Chris McDonough
chrism@zope.com
03 Feb 2003 09:58:44 -0500
All that's fine by me, and allowing an error handler to have side
effects explicitly is probably a good idea... will anybody volunteer to
do this for 2.7?
- C
On Mon, 2003-02-03 at 03:44, Steve Alexander wrote:
> By conincidence I'm implementing something similar for error handling in
> Zope 3 right now.
>
> Here's the kind of thing I'm doing in zope 3, using the same notation
> Dieter used. First, the simple case where the error handler will
> definitely not need to alter any state:
>
> ## request starts
> transaction.begin()
> try:
> object= REQUEST.traverse(...)
> result = mapply(object,...)
> transaction.commit()
> except:
> try:
> try:
> result = handle_error()
> except:
> result = default_handle_error()
> # Zope's default error handling
> # it must not have side effects
> finally:
> transaction.abort()
> request.response.setBody(result)
> ## request ends
>
> If there's an exception handler that has side-effects, it must
> explicitly say so, and we get this:
>
> ## request starts
> transaction.begin()
> try:
> object= REQUEST.traverse(...)
> result = mapply(object,...)
> transaction.commit()
> except:
> try:
> try:
> # this call returns a special
> # 'I have side-effects' token.
> result = handle_error()
> except:
> result = default_handle_error()
> # Zope's default error handling
> # it should not have side effects
> finally:
> transaction.abort()
>
> if result is I_HAVE_SIDE_EFFECTS:
> transaction.begin()
> transaction.note('%s (application error handling)'
> % '/'.join(object.getPhysicalPath))
> try:
> result = handle_error_with_sideeffects()
> transaction.commit()
> except:
> try:
> result = default_handle_error()
> # Zope's default error handling
> # it should not have side effects
> finally:
> transaction.abort()
> else:
> request.response.setBody(result)
> ## request ends