How pass exception raised in decorator to function decorated?
我希望修饰的函数可以捕获它的修饰器引发的异常
1 2 3 4 5 6 7 8 9 10 | def decorator(func): def _decorator(request, *args, **kwargs): if condition: return func(request, *args, **kwargs) else: """ THIS EXCEPTION CAN'T BE CAUGHT FROM FUNCTION DECORATED """ raise LimitReached return _decorator |
我该怎么走?
这是不可能的。修饰函数是一个内部作用域,无法捕获在修饰器外部作用域中引发的异常。想想运行代码的三个步骤。
(1)在调用decorated函数之前,decorator运行一些代码…修饰函数不能捕获任何异常,因为它还没有运行。
(2)装饰调用装饰函数…现在装饰器不能引发异常,因为它没有运行。
(3)函数返回,装饰代码再次运行…修饰函数无法捕获任何内容,因为它已经完成了执行。
(编辑)
这个问题有解决办法。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | def func(p1, p2, kw1=None, errorstate=None): if errorstate: do_error_path() return def decorator(func): def _decorator(request, *args, **kwargs): if condition: return func(request, *args, **kwargs) else: kwargs = kwargs.copy() kwargs['errorstate'] = LimitReached() return func(request, *args, **kwargs) return _decorator |