2011-09-19 8 views
5

반복자/생성기가 예외를 던진 후에도 반복 수행을 계속할 수있는 방법이 있습니까? 아래 코드와 마찬가지로 ZeroDivisionError를 건너 뛰고 gener()을 반복하면서 run() 함수를 수정하지 않고도 계속 반복 할 수 있습니까?반복자/생성기에서 파이썬으로 예외 발생 후 계속하십시오.

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

아마도이 간단한 경우입니다. 그러나 반복이 기본적으로 중지되는 함수를 원한다면 예외를 catch하는 다음 항목을 계속할 수 있습니까? 우리는 무엇인가 잘못되었다는 외부 신호가 있어야합니다. – sergzach

+0

@sergzach : 우리는'pass' 대신에'yield None'과 같은 것을 할 수 있고 호출자에서 특별한 경우를 잡을 수 있습니다. –

2

한 가지 가능한 솔루션은 단지 블록을 제외하고 시도 ...에 문제가 코드를 포장한다 :

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