catching exceptions from an except: block

Gerard Flanagan grflanagan at yahoo.co.uk
Fri Mar 9 08:49:59 CET 2007


On Mar 8, 10:31 am, "Gabriel Genellina" <gagsl-... at yahoo.com.ar>
wrote:
> En Thu, 08 Mar 2007 06:17:37 -0300, Gerard Flanagan
> <grflana... at yahoo.co.uk> escribió:
>
> > @onfail(False)
> > def a(x):
> >     if x == 1:
> >         return 'function a succeeded'
> >     else:
> >         raise
>
> I know it's irrelevant, as you use a bare except, but such raise looks a
> bit ugly...
>
> --
> Gabriel Genellina

Agreed. I thought a 'gentle reader' could have filled in the blanks,
but I suppose I should have taken the time to put in a custom
exception.

Another version:

import exceptions

class ABCException(exceptions.Exception):
    pass

class DoItException(exceptions.Exception):
    pass

def onfailFalse(fn):
    def inner(*args, **kwargs):
        try:
            return fn(*args, **kwargs)
        except ABCException:
            return False
    return inner

@onfailFalse
def a(x):
    if x == 1:
        return 'function a succeeded'
    else:
        raise ABCException()

@onfailFalse
def b(x):
    if x == 2:
        return 'function b succeeded'
    else:
        raise ABCException()

@onfailFalse
def c(x):
    if x == 3:
        return 'function c succeeded'
    else:
        raise ABCException()

def doit(x):
    for f in [a, b, c]:
        result = f(x)
        if result:
            return result
    raise DoItException()

print doit(1)
print doit(2)
print doit(3)
print doit(4)




More information about the Python-list mailing list