困惑的python装饰器

时间:2018-08-23 08:34:58

标签: python python-decorators

deco1:

def deco(func):
    def wrapper(*args, **kwargs):
        f = func(*args, **kwargs)
        print("deco success")
        return f

return wrapper

deco2:

def deal_exc(func):
    def wrapper(*arg, **kwargs):
        try:
             return func(*arg, **kwargs)
        except Exception as e:
             print(str(e))

    return wrapper

使用decos:

@deal_exc
@deco
def a_function():
    print(0 / 100)
    raise Exception("666")

当我引发异常时如何跳过print("deco success")并让deal_exc装饰器处理该异常?

2 个答案:

答案 0 :(得分:1)

将装饰器放在装饰器上方时,上装饰器实际上包装(读取调用)下装饰器,类似地,下装饰器包装(读取调用)实际功能。

因此,除非删除装饰器,否则不能跳过处理。

如果您希望内部装饰器(deco)不处理某些特定情况,则必须对其进行检查。例如:

在上述情况下,由于内部装饰器中没有try-catch处理,因此函数抛出的异常将由最外面的装饰器(deal_exc)自动处理。

答案 1 :(得分:0)

请如下更新装饰器功能:

def deco(func):
    def wrapper(*args, **kwargs):
        try:
            f = func(*args, **kwargs)
            print("deco success")
        except:
            return f

return wrapper

try-catch语句可以帮助您根据需要处理异常。