Weird exception handling behavior -- late evaluation in except clause

Steven D'Aprano steve+comp.lang.python at pearwood.info
Mon Dec 3 02:30:26 EST 2012


On Mon, 03 Dec 2012 16:24:50 +1100, Chris Angelico wrote:

> On Mon, Dec 3, 2012 at 8:31 AM, Steven D'Aprano
> <steve+comp.lang.python at pearwood.info> wrote:
>> Consider this piece of legal Python code:
>>
>> Err = None
>> if condition(x) > 100:
>>     Err = OneException
>> elif another_condition(x):
>>     Err = AnotherException
>> try:
>>     spam(a, b, c)
>> except Err:
>>     recover()
> 
> Legal it may be, but are there times when you actually _need_ this level
> of dynamism? It strikes me as a pretty weird way of going about things.
> 
> I agree with the point you're making, but this feels like a contrived
> example, and I'm curious as to whether it can be uncontrived.


Yeah, in hindsight it was a pretty crappy example. But this sort of 
dynamism really is useful:

def testRaises(exc, func, *args):
    try:
        result = func(*args)
    except exc:
        return
    raise AssertionError("expected exception but didn't get one")


def wrap(func, exc, default=None):
    @functools.wraps(func)
    def inner(*args):
        try:
            return func(*args)
        except exc:
            return default
    return inner


-- 
Steven



More information about the Python-list mailing list