2011-09-19 90 views
5

Python中是否有任何方法可以在迭代器/生成器抛出的异常之后继续迭代?像下面的代码一样,是否有任何方法可以跳过ZeroDivisionError并继续循环通过gener()而不需要执行run()函数?在python中的迭代器/生成器异常提升后继续

def gener(): 
    a = [1,2,3,4,0, 5, 6,7, 8, 0, 9] 
    for i in a: 
     yield 2/i 

def run(): 
    for i in gener(): 
     print i 

#---- run script ----# 

try: 
    run() 
except ZeroDivisionError: 
    print 'what magick should i put here?' 

回答

8

try/except的合乎逻辑的地方是哪里有问题的计算发生地:

def gener(): 
    a = [1,2,3,4,0, 5, 6,7, 8, 0, 9] 
    for i in a: 
     try: 
      yield 2/i 
     except ZeroDivisionError: 
      pass 
+1

在这种简单的情况下可能是的。但是如果我们需要一个默认停止迭代的函数,但是我们可以继续处理下一个捕获异常的项目?我们应该有一个外部信号,说明有什么不对。 – sergzach

+0

@sergzach:我们可以做'yield None'而不是'pass',并在调用者中捕获这个特殊情况。 –

2

一个可能的解决方案只是包装问题的代码放到try ... except块:

def gener(): 
    a = [1,2,3,4,0, 5, 6,7, 8, 0, 9] 
    for i in a: 
     try: 
      div_result = 2/i 
     except ZeroDivisionError: 
      div_result = None 

     yield div_result 
0

我不确定,但如果您想要了解发生错误的位置,可能会更适合您:

def gener(): 
    a = [1, 2, 3, 4, 0, 5, 6, 7, 8, 0, 9] 
    errors = [] 
    for idx, i in enumerate(a): 
     try: 
      yield 2/i 
     except ZeroDivisionError: 
      errors.append('ZeroDivisionError occured at idx = {}'.format(idx)) 
    raise RuntimeWarning('\n'.join(errors))