else: w/o except: - why not?

Robin Munn rmunn at pobox.com
Wed Apr 2 17:58:22 CEST 2003


Anna <revanna at mn.rr.com> wrote:
> On Tue, 01 Apr 2003 07:33:57 +0000, Michael Chermside wrote:
> 
>> I can't speak for Tim, but my OWN opinion is precisely in alignment with
>> what you have written.
>> 
>> I think that a "bare except" is useful in only two ways. The first is like
>> a "finally" clause that's skipped if everything works. In other words, the
>> following bits of code is (almost[1]) equivalent to your second example:
>> 
>>     everythingWorked = False
>>     try:
>>         f1()
>>         everythingWorked = True
>>     finally:
>>         if not everythingWorked:
>>             f2()
>> 
>> This doesn't come up much, but it's occasionally useful, and your version
>> (using bare except with a raise) is a little prettier.
> 
> I thought that finally clauses are *always* run, whether an exception was
> raised or not. 
> 
> Looks at code closely... So, in this case the finally is run (in terms of
> evaluating the "if" statement), but function f2 may not happen depending
> on the results of the "if". So the finally isn't really skipped, it just
> doesn't do much if everything worked properly in the try clause. Right?
> 
> I'm not being picky - just seeing if I understand this correctly. Thanks.

Yes, you've got it right. If an exception is raised during f1(), then
the "everythingWorked = True" line is never reached, because program
execution flow jumps to the finally: clause, which would then call f2()
because everythingWorked is still False. Note that after any finally:
clause is executed, the exception then continues to propagate upwards.
If f1() raised no exceptions, then the finally: clause is still
executed, but this time everythingWorked is True, so f2() is not called.

The way to express that using try...except is:

    try:
        f1()
    except:
        f2()
        raise

-- 
Robin Munn <rmunn at pobox.com>
http://www.rmunn.com/
PGP key ID: 0x6AFB6838    50FF 2478 CFFB 081A 8338  54F7 845D ACFD 6AFB 6838




More information about the Python-list mailing list