[Python-3000] self-contained exceptions

Josiah Carlson jcarlson at uci.edu
Wed Jan 10 18:32:57 CET 2007


"Greg Falcon" <veloso at verylowsodium.com> wrote:
[snip]
> I'm coming from a philosophy, though, that believes any time a
> syntactic construct creates a local binding and a new suite to use it
> in, the binding shouldn't escape that suite.  Yes, I'm really talking
> about 'for', and I know this is probably a controversial view.  But
> don't the same arguments apply?  (It's probably an error to use the
> variable outside the suite, and if you really need to, you could be
> explicit and store another reference to it in a separate local.)

Yeah, I like reusing the variable names bound in a for loop.  And unless
we are going to attempt to simplify the <assignment target> in...

    for <assignment target> in ...:
        ...

to only be a bare name, and not things like 'i, (j, k)', then removing
names is going to be difficult.  I would be -1 on any changes to the for
loop syntax (value unpacking is so darn convenient), and without syntax
change, then variable bleeding semantics would be difficult to change 
(which I am also -1 on).


> re = get_resource()
> ...
> try:
>   something()
> except RareException as re:
>   ... # handle it
> ...
> re.use_resource()
> 
> Which *appears* to work fine most of the time, but when the
> RareException is raised and handled, suddenly the use_resource() line
> generates a surprising UnboundLocalError.  These are the sort of
> things that should be caught ahead of time if possible.

According to the translation rules Colin has previously provided...

    re = get_resource()
    ...
    try:
        something()
    except RareException as re:
        ...
    ...
    re.use_resource()

is translated into...

    re = get_resource()
    ...
    try:
        try:
            something()
        except RareException:
            re = <current exception>
            ...
    finally:
        re = None
        del re
    ...
    re.use_resource()

That is, the 're = None; del re' stuff is executed regardless of whether
the except body is executed.  The user would be notified right away.


 - Josiah



More information about the Python-3000 mailing list