[Python-Dev] PEP 340: Else clause for block statements
Anders J. Munch
ajm at flonidan.dk
Mon May 2 12:03:06 CEST 2005
GvR wrote:
> [Nick Coghlan]
> > Option 2: mimic if semantics
> > An 'else' clause on a block statement behaves vaguely like the else
clause on
> > an if statement - the clause is executed only if the first suite is
never
> > entered, but no exception occurs (i.e. StopIteration is raised by the
first call
> > to next).
>
> Strange because it's different from the behavior of a for loop, and
> the block-statement doesn't feel like an if-statement at all. But I
> could actually imagine a use case: when acquiring a lock with a
> time-out, the else-clause could be executed when the acquisition times
> out.
>
> block locking(myLock, timeout=30):
> ...code executed with lock held...
> else:
> ...code executed if lock not acquired...
A file-closing block function has the same need, as does any block
function that manages a resource, whose acquisition might fail.
A surrounding try/except doesn't quite cut it; the problem is that the
try-clause will then also cover the suite.
Example:
try:
in opening('file1') as f1:
...
in opening('file2') as f2:
...
except IOError:
print "file1 not available, I'll try again later"
How do I tell try/except that I really only meant to trap
opening('file1'), but opening 'file2' is not supposed to fail so I
want any exception from that propagated? Better if I could write:
in opening('file1') as f1:
...
in opening('file2') as f2:
...
else:
print "file1 not available, I'll try again later"
or even
in opening('file1') as f1:
...
in opening('file2') as f2:
...
except IOError:
print "file1 not available, I'll try again later"
I rather like this version, because it is patently clear what should
happen if there is no except-clause: The exception propagates
normally.
- Anders
More information about the Python-Dev
mailing list