我碰到了一种情况,我需要在我的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
谢谢!
答案 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)
。
依赖于内部代码详细信息的那些硬编码检查是不受欢迎的,尤其是,因为在您的特定示例中,您无法控制其实现。