如果没有产生数据,则在生成器内部引发错误

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()

现实中的test1test2是遍历数据,搜索匹配项,操作数据和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 将生成自己的生成器。