2012-12-14 2 views
0

나는 내 try/except 중첩 된 생성자가 StopIteration 예외를 발생시키는 코드를 결정해야하는 상황에 부딪 혔습니다. 어떻게해야합니까? 다음은 모범 사례입니다.어떤 중첩 된 생성기가 StopIteration 예외를 생성하는지 확인하는 방법은 무엇입니까?

def genOne(iMax, jMax): 
    i = 0; 
    g2 = genTwo(jMax) 
    while i <= iMax: 
     print('genOne: ' + str(i)) 
     next(g2) 
     yield 
     i = i + 1 

def genTwo(jMax): 
    j = 0; 
    while j <= jMax: 
     print('genTwo: ' + str(j)) 
     yield 
     j = j + 1 

g1 = genOne(6, 3)  # The inputs are arbitrary numbers 
try: 
    while True: 
     next(g1)  
except: 
    # Do some processing depending on who generates the StopIteration exception 

고마워요!

+0

왜 'genOne'이 예외를 처리하지 않습니까? – Blender

+0

실제 문제에서는 발전기에 액세스 할 수 없습니다. 발전기를 수정할 수 없다고 가정하고 쉽게 결정할 수 있습니까? – kaosad

답변

2

이것은 임의의 예외의 근원을 찾는 문제로 일반화 될 수 있습니다.

을 사용하면 예외 개체의 스택 추적을 검사 할 수 있습니다.

여기에 비슷한 주제의 previous answer이 있습니다.

일부 예 번호 :

g1 = genOne(6, 3)  # The inputs are arbitrary numbers 
try: 
    while True: 
     next(g1)  
except: 
    exc_type, exc_value, exc_traceback = sys.exc_info() 
    print(traceback.extract_tb(exc_traceback)[-1]) 

셸 출력 : extract_tb() 호에 명시 [-1] 스택 트레이스의 제 1 하부 레벨을 확인하는 것이

> ./test.py 
genOne: 0 
genTwo: 0 
genOne: 1 
genTwo: 1 
genOne: 2 
genTwo: 2 
genOne: 3 
genTwo: 3 
genOne: 4 
('./test.py', 12, 'genOne', 'next(g2)') 

참고. 인쇄물을 통해 해당 출력의 어떤 요소를 확인해야하는지 확인할 수 있습니다 (해당 목록의 genOne -> item index # 2). 귀하의 특정 예제에서 가장 낮은 수준의 생성자 문자열 genTwotraceback.extract_tb(exc_traceback) 배열의 요소에 있는지 확인하고 싶을 것입니다. 내부 코드 정보에 의존

그 하드 검사는 특히당신이 그들의 구현을 제어 할 수 없습니다 특정 예에 있기 때문에, 눈살을 찌푸리게하고있다.

+0

제안 해 주셔서 감사합니다. – kaosad

관련 문제