try..yield..finally problem: a proposed solution.
Andrew Bennetts
andrew-pythonlist at puzzling.org
Thu Jun 5 10:18:12 EDT 2003
On Thu, Jun 05, 2003 at 03:01:55PM +0100, Alan Kennedy wrote:
[..snip lots of discussion of various code snippets..]
>
> So, restating the proposed solution, with fully specified code
>
> #------------------------------
>
> import random
>
> class Finality(Exception): pass
>
> def finfunc():
> try:
> try:
> # Risky code, e.g.
> for i in range(10):
> x = 1/int(random.random()*10)
> yield x
> print "Successful processing"
> raise Finality
> except Exception, x:
> print "Finally"
> raise x
> except Finality:
> pass
> except Exception, x:
> print "Told you that code was risky, didn't I?: %s" % str(x)
>
> for v in finfunc():
> print v
>
> #------------------------------
I've almost nothing to add here, except to suggest that instead of "raise
x", just use "raise", which will preserve the full traceback :)
The approach of explicitly raising an exception even if you succeed so that
you *always* enter the except block does indeed solve the problem, by
turning the except into a de facto finally. I understand what you're doing
now :)
-Andrew.
More information about the Python-list
mailing list