【发布时间】:2022-01-09 01:30:03
【问题描述】:
我有一个装饰器:
def remediation_decorator(dec_mthd):
def new_func(*args, **kwargs):
try:
return dec_mthd(*args, **kwargs)
except (KeyError, HTTPError) as err:
print(f'error = {err}... call the remediation function')
return new_func
在生成器函数内部,调用另一个函数在特定条件下引发特定异常:
def check(number):
if number == 1:
raise HTTPError
if number == 2:
raise KeyError
这个生成器函数是这样装饰的:
@remediation_decorator
def dec_mthd_b(number):
check(number)
for i in range(0,3):
yield i+1
当 check 函数引发异常时,装饰器的 except 不会被命中。
[ins] In [16]: dec_mthd_b(1)
Out[16]: <generator object dec_mthd_b at 0x10e79cc80>
它的行为似乎是这样的,因为它是一个生成器函数 - 来自Yield expressions:
当调用生成器函数时,它会返回一个称为生成器的迭代器。
(我想知道是否从字面意义上理解“它首先返回迭代器而不管函数中的其他逻辑”,因此为什么 check() 不会引发异常?)
和,
暂停是指保留所有局部状态,包括局部变量的当前绑定、指令指针、内部评估堆栈,以及任何异常处理的状态。
我是否理解正确?请问谁能进一步解释一下?
【问题讨论】:
-
很遗憾,我不知道答案,但我为自己添加了 this question 的书签,因为我总是忘记
yield和生成器是如何工作的。也许它会有一些用处。 -
有一个很好的概述here。再读一遍,我认为它很好地解释了这里发生的事情,因为它说“当你调用函数时,你在函数体中编写的代码不会运行”
-
next(dec_mthd_b(1)) 引发所需的异常
标签: python generator decorator