关于python:如何将装饰器中引发的异常传递给功能装饰?

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)函数返回,装饰代码再次运行…修饰函数无法捕获任何内容,因为它已经完成了执行。

(编辑)

这个问题有解决办法。func知道它应该捕获某种异常。同一个func可以被写入一个参数,该参数告诉它处于错误状态。我不确定这是否是最好的解决方案(这里是否需要装饰师?)但我可以确信…

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