您能向我解释为什么在示例中从未执行过except子句并且从未调用过print吗?
def h(lst):
try:
yield from lst
except StopIteration:
print('ST')
t = h([1,2])
next(t)
>>> 1
next(t)
>>> 2
next(t)
>>> Traceback (most recent call last):
File "<ipython-input-77-f843efe259be>", line 1, in <module>
next(t)
StopIteration
答案 0 :(得分:2)
您的next
调用在您的h
函数的外部之外,因此try
/ except
子句未涵盖。为了进行比较,请尝试以下操作:
def h(lst):
yield from lst
t = h([1,2])
然后重复运行:
try:
print(next(t))
except StopIteration:
print('ST')
结果:
1
2
'ST'
'ST'
'ST'
...
答案 1 :(得分:2)
StopIteration
由next
而不是yield from
抛出:
next(iterator[, default])
通过调用其
__next__()
方法从迭代器中检索下一项。如果给出了 default ,则如果迭代器已耗尽,则返回它,否则引发StopIteration
。
因此,您可以包装next
调用。
def h(lst):
yield from lst
def next_or_print(it):
try:
next(it)
except StopIteration:
print('ST')
然后您像这样使用它:
>>> t = h([1,2])
>>> next_or_print(t)
1
>>> next_or_print(t)
2
>>> next_or_print(t)
ST
请注意,next
还有一个第二个参数,它允许提供一个 default 而不是StopIteration
:
>>> t = h([1,2])
>>> next(t, 'ST')
1
>>> next(t, 'ST')
2
>>> next(t, 'ST')
ST
答案 2 :(得分:0)
componentDidMount()
函数“ h”返回一个生成器。语句“ yield”作为“ return”不执行任何操作,仅返回生成器。例外不会出现在代码的那部分。
必须将异常转移到代码的另一部分,然后在该部分起作用。
def h(lst):
try:
yield from lst
except StopIteration:
print('ST')
t = h([1, 2])
>>> print(t)
<generator object h at 0x7fbf6f08aa40>