gpt4 book ai didi

python - 如何在装饰器中捕获异常

转载 作者:太空宇宙 更新时间:2023-11-04 09:07:51 25 4
gpt4 key购买 nike

我有一个函数导致异常,我希望它成为一个装饰器。代码如下:

def des(i):
def new_func(func):
if i == 1:
raise Exception
else:
return func
return new_func


@des(1)
def func():
print "!!"


if __name__ == '__main__':
try:
func()
except Exception:
print 'error'

但是输出是:

Traceback (most recent call last):
File "D:/des.py", line 10, in <module>
@des(1)
File "D:/des.py", line 4, in new_func
raise Exception
Exception

那么,我怎样才能捕捉到这个异常呢?

最佳答案

正如其他答案所解释的那样,您当前的问题是在将装饰器应用于函数时引发异常,而不是在调用函数时引发异常。

要解决此问题,您需要使装饰器返回一个引发异常的函数。这是它的工作原理:

import functools

def des(i):
def decorator(func):
if i != 1:
return func # no wrapper needed

@functools.wraps(func)
def raiser(*args, **kwargs):
raise Exception

return raiser

return decorator

des 函数是一个“装饰器工厂”。除了为它返回的装饰器提供一个范围来保存 i 参数外,它实际上什么也没做。

decorator 函数会检查是否需要做任何特殊的事情。如果不是,则返回未修改的装饰函数。如果 i==1,它返回一个自定义函数。

如果 i==1raiser 函数是装饰器的返回值。它总是在调用时引发异常。应用于它的 functools.wraps 装饰器并不是绝对必要的,但它使它看起来更像原始函数(相同的 __name____doc__,等)。

关于python - 如何在装饰器中捕获异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18327014/

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