Phillip J. Eby wrote:
> At 08:41 AM 5/13/2005 -0700, Guido van Rossum wrote:
>
>>The 'oke' argument is so that the author of transactional() can decide
>>what to do with a non-local goto: commit, rollback or hit the author
>>over the head with a big stick.
<snip>
> * Automatically roll back partially-done work in case of exception, and/or
> "roll forward" completed work (try/except/else, used for "transaction"
> scenarios)
Doing transactions with try/except/else is not quite correct, since using any
of
the three non-local goto's actually executes neither the commit nor the
rollback
(of course, this is where Guido's stick comment comes into play. . .).
However, I'm fine with declaring that, from the perspective of a statement
template, 'return', 'break' and 'continue' are all 'non-exceptional exits', and
so templates like transaction() are expected to treat them as such.
Picking one way and enforcing it by restricting the information seen by
__exit__() also seems to be a much better option than allowing the possibility
of:
do bobs.transaction():
break
# Triggers a rollback!
do alices.transaction():
break
# Triggers a commit!
Going the 'non-exceptional exits' route also saves inventing a pseudo-exception
to stand in for the 3 non-local goto statements (such a pseudo-exception would
recreate the above behavioural hole, anyway).
An exceptional exit can be forced if a non-local goto needs to be executed in
response to a failure:
class AbortDo(Exception): pass
do alices.transaction():
break
# Triggers a commit (non-exceptional exit)
try:
do alices.transaction():
raise AbortDo
# Triggers a rollback (exceptional exit)
except AbortDo:
break
Cheers,
Nick.
--
Nick Coghlan | [EMAIL PROTECTED] | Brisbane, Australia
---------------------------------------------------------------
http://boredomandlaziness.blogspot.com
_______________________________________________
Python-Dev mailing list
[email protected]
http://mail.python.org/mailman/listinfo/python-dev
Unsubscribe:
http://mail.python.org/mailman/options/python-dev/archive%40mail-archive.com