Search code examples
pythonpython-3.xpython-decorators

Apply a function and check custom exceptions with decorators


I want to write a function that check a condition (with custom exceptions) and if no exceptions are raised it applies a function and return the result.

# Custom exceptions
class NegativeNumber(Exception):
    pass
class BigNumber(Exception):
    pass

def add_two(number):
    return number + 2

def apply_function(number, f):
    def check_condition(number, f):
        try:
            if number < 0:
                raise NegativeNumber
            if number > 10:
                raise BigNumber
        except NegativeNumber:
            return ("Negative Number")
        except BigNumber:
            return ("Big Number")
        return (f(number))
    return check_condition(number, f)


apply_function(5, add_two)

Can be this code written better using decorators?


Solution

  • You've already done most of it. I modified your function name and the structure of your code a bit. This should be what you are looking for:

    # Custom exceptions
    class NegativeNumber(Exception):
        pass
    class BigNumber(Exception):
        pass
    
    def check_exceptions(f):
        def wrapped(number):
            try:
                if number < 0:
                    raise NegativeNumber
                if number > 10:
                    raise BigNumber
            except NegativeNumber:
                return "Negative Number"
            except BigNumber:
                return "Big Number"
            return f(number)
        return wrapped
    
    @check_exceptions
    def add_two(number):
        return number + 2
    
    for num in (-1, 5, 15):
        print(add_two(num))
    

    Output:

    Negative Number
    7
    Big Number