[Python-ideas] Retry clause (was: Extending error handling on with statements.)
Andre Engels
andreengels at gmail.com
Mon Mar 28 07:33:47 CEST 2011
On Mon, Mar 28, 2011 at 5:15 AM, Mike Meyer <mwm at mired.org> wrote:
> On Sun, 27 Mar 2011 22:33:52 +0100
> Jakob Bowyer <jkbbwr at gmail.com> wrote:
>
>> I personally love using with statements when handling file like objects.
>> This is all well and good until an exception is thrown from the with
>> statement. This is ok if you expect the exception because you can use try
>> and except but personally I feel that another condition to with would feel
>> more 'pythonic' this means that you could fail the with statement with an
>> exception jump to the clause, then jump back to the with statement trying
>> the code in the clause e.g. rather than
>
> The idea of exception handlers "jumping back" is actually good enough
> to have been implemented in one language (eiffel), but sufficiently
> different from what "except" does that I think it calls for new
> syntax.
>
> How about a "retry" clause for try statements? I think it runs into
> the same problems as an "except" clause when it comes to adding it to
> the with clause, so lets skip that for now.
>
> retry ...: as part of a try clause would work just like an except
> clause: if the exception was one of those listed after retry, then
> you'd enter the block following the retry, otherwise you skip it. If
> the retry block raises an exception or hits "return" or "yield", it
> behaves just like an except block. If the retry block executes it's
> last statement, it then branches back to the first statement of the
> "try" block.
>
> This would let you write something like:
>
> i = 0
> try:
> with open("tmpname.%d" % i, 'r') as inp:
> ....
> retry IOError:
> if IOError.errno != ENOENT:
> raise
> i += 1
> if i > 100:
> raise
>
> To search for a file.
I think 'retry' would be clearer if it is used as a command on its
own, like return, break or continue, but then only within an except
block. Your code above could then go:
...
except IOError:
if IOError.errno != ENOENT:
raise
i += 1
if i <= 100:
retry
else:
raise
--
André Engels, andreengels at gmail.com
More information about the Python-ideas
mailing list