[Python-ideas] suggestion for try/except program flow

Guido van Rossum guido at python.org
Sat Mar 28 22:24:11 CET 2009


On Sat, Mar 28, 2009 at 9:54 AM, Mark Donald <foobarmus at gmail.com> wrote:
> Unless something has changed in Python 3+, I believe Nick's idiom
> requires the generic handler code to be copied into a second except
> clause to achieve identical behaviour, as follows...
>
> except BaseException as e:
>    if isinstance(e, Cheese):
>        # handle cheese
>    # handle all manner of stuff, including cheese
> except:
>    # handle all manner of OTHER stuff in the same way

In 3.0, the second except clause is unreachable because all exceptions
inherit from BaseException.

> ...which makes the nested try block more semantic. This can be tested
> by putting > raise "this is deprecated..."  into the try block, which
> generates an error that is NOT caught by "except BaseException"
> however IS caught by "except".
>
> I realise that "recatch" may seem like a trivial suggestion, but I
> believe it would be a slight improvement, which means it's not
> trivial. Try/except statements are supposedly preferential to
> "untried" if statements that handle isolated cases, but if statements
> are a lot easier to imagine, so people use them all them time - style
> be damned. Each slight improvement in try/except is liable to make it
> more attractive to coders, the end result being better code (for
> example, the implementation of PEP 341 increased my team's use of
> try/except significantly, causing a huge improvement to code
> readability).
>
> Imagine if you could do this:
>
>    runny = True
>    runnier_than_you_like_it = False
>    raise Cheese
> except Cheese, e
>    # handle cheese
>    if runny: recatch as Camembert
> except Camembert, e
>    # handle camembert
>    if runnier_than_you_like_it:
>        recatch
>    else:
>        uncatch # ie, else clause will be effective...
> except:
>    # not much of a cheese shop, really is it?
> else:
>    # negotiate vending of cheesy comestibles
> finally:
>    # sally forth
>
> And, I'm not trying to be belligerent here, but before somebody says...
>
> Cheese(Exception)
> Camembert(Cheese)
>
> ...just please have a little think about it.
>
> Mark
>
> 2009/3/28 Guido van Rossum <guido at python.org>:
>> On Sat, Mar 28, 2009 at 5:06 AM, Mark Donald <foobarmus at gmail.com> wrote:
>>> In this situation, which happens to me fairly frequently...
>>>
>>> try:
>>>  try:
>>>     raise Cheese
>>>  except Cheese, e:
>>>     # handle cheese
>>>     raise
>>> except:
>>>  # handle all manner of stuff, including cheese
>>>
>>> ...it would be nice (& more readable) if one were able to recatch a
>>> named exception with the generic (catch-all) except clause of its own
>>> try, something like this:
>>>
>>> try:
>>>  raise Cheese
>>> except Cheese, e:
>>>  # handle cheese
>>>  recatch
>>> except:
>>>  # handle all manner of stuff, including cheese
>>
>> I'm not sure recatch is all that more reasonable -- it's another
>> fairly obscure control flow verb. I think the current situation isn't
>> so bad. Nick already pointed out an idiom for doing this without two
>> try clauses:
>>
>> except BaseException as e:
>>  if isinstance(e, Cheese):
>>    # handle cheese
>>  # handle all manner of stuff, including cheese
>>
>> --
>> --Guido van Rossum (home page: http://www.python.org/~guido/)
>>
>



-- 
--Guido van Rossum (home page: http://www.python.org/~guido/)



More information about the Python-ideas mailing list