如何确定哪个嵌套生成器产生StopIteration异常?

时间:2012-12-14 09:38:04

标签: python-3.x

我碰到了一种情况,我需要在我的try/except代码中确定哪个嵌套生成器引发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

谢谢!

1 个答案:

答案 0 :(得分:2)

这可以推广到找到任意异常的起源的问题。

使用traceback module检查异常对象的堆栈跟踪。

以下是类似主题的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])

Shell输出:

> ./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)')

请注意[-1]调用中的extract_tb()只显式检查堆栈跟踪的第一个较低级别。通过打印,您可以看到您需要检查该输出的哪个元素(genOne - &gt;该列表中的项目索引#2)。在您的特定示例中,您可能想要检查genTwo数组的任何元素中是否存在最低级别的生成器字符串traceback.extract_tb(exc_traceback)

依赖于内部代码详细信息的那些硬编码检查是不受欢迎的,尤其是,因为在您的特定示例中,您无法控制其实现。