[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