gpt4 book ai didi

python - 如何将装饰器中引发的异常传递给装饰函数?

转载 作者:太空宇宙 更新时间:2023-11-03 16:48:24 25 4
gpt4 key购买 nike

我希望被装饰的函数能够捕获其装饰器引发的异常

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) 装饰器在调用装饰函数之前运行一些代码...装饰函数无法捕获任何异常,因为它尚未运行。

(2) 装饰器调用被装饰的函数...现在装饰器无法引发异常,因为它没有运行。

(3) 函数返回,装饰器代码再次运行...装饰函数无法捕获任何内容,因为它已经完成执行。

(编辑)

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

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

关于python - 如何将装饰器中引发的异常传递给装饰函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36106130/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com