如果没有产生数据,则在生成器内部引发错误
Raise an error inside a generator if no data has been yielded
如果 yield
没有发生,我想在生成器内部引发错误。
下面是我的问题的一个非常简单的例子:
def test1():
for i in range(1, 28):
if i % 5 == 0:
yield str(i)
raise CustomEXception
def test2(x):
for i in range(1, 38):
if i % x == 0:
yield str(i)
raise CustomEXception
a = test1()
b = test2()
现实中的test1
和test2
是遍历数据,搜索匹配项,操作数据和yield
。如果未产生任何数据,则会引发错误。
for w,q in itertools.products(a, b):
try:
print(w + q)
# do some more operation with w, q
except CustomException:
# do some more checking
生成器的结果用于创建笛卡尔积。
问题是这不起作用,引发了异常,之前没有产生任何结果。
由于您的异常是由耗尽迭代器的 product
调用引发的,因此您必须以不同的方式构建它:
try:
for w, q in itertools.products(a, b):
print(w + q)
# do some more operation with w, q
except CustomException:
# do some more checking
请注意,现在 products(a,b)
在 try
块内。循环体本身只处理 w,q
after 它在 成功 yield 后从生成器传递执行流。
此外,如果没有 yields
,您还必须确保您的函数只会 raise
异常
def test2(x):
fail = True
for i in range(1,38):
if i % x == 0:
fail = False
yield str(i)
if fail:
raise ValueError
这样一来,如果有一个或多个 yields
则不会引发异常,并且 product
将生成自己的生成器。
如果 yield
没有发生,我想在生成器内部引发错误。
下面是我的问题的一个非常简单的例子:
def test1():
for i in range(1, 28):
if i % 5 == 0:
yield str(i)
raise CustomEXception
def test2(x):
for i in range(1, 38):
if i % x == 0:
yield str(i)
raise CustomEXception
a = test1()
b = test2()
现实中的test1
和test2
是遍历数据,搜索匹配项,操作数据和yield
。如果未产生任何数据,则会引发错误。
for w,q in itertools.products(a, b):
try:
print(w + q)
# do some more operation with w, q
except CustomException:
# do some more checking
生成器的结果用于创建笛卡尔积。
问题是这不起作用,引发了异常,之前没有产生任何结果。
由于您的异常是由耗尽迭代器的 product
调用引发的,因此您必须以不同的方式构建它:
try:
for w, q in itertools.products(a, b):
print(w + q)
# do some more operation with w, q
except CustomException:
# do some more checking
请注意,现在 products(a,b)
在 try
块内。循环体本身只处理 w,q
after 它在 成功 yield 后从生成器传递执行流。
此外,如果没有 yields
raise
异常
def test2(x):
fail = True
for i in range(1,38):
if i % x == 0:
fail = False
yield str(i)
if fail:
raise ValueError
这样一来,如果有一个或多个 yields
则不会引发异常,并且 product
将生成自己的生成器。