【发布时间】:2016-08-21 22:40:43
【问题描述】:
我正在编写这样的 4 个列表迭代器的循环:
it0 = iter(['foo','bar'])
it1 = iter(['bar','foo'])
it2 = iter(['foo','foo'])
it3 = iter(['bar','bar'])
try:
a, b, c, d = map(next, (it0, it1, it2, it3))
while True:
#some operations that can raise ValueError
if a+b+c+d == 'foobar'*2:
a, b, c, d = map(next, (it0, it1, it2, it3))
elif a+b == 'foobar':
c, d = map(next,(it2, it3))
else:
a, b = map(next,(it0, it1))
except StopIteration:
pass
但是当我在 Python3 中运行这段代码时,我得到了一个 ValueError: not enough values to unpack (expected 2, got 0),在预期的 StopIteration 之前提出。
我不想在except 语句中捕获ValueError,因为while 循环中的某些操作也可能导致应该停止程序的ValueError。
next 怎么在赋值前没有抛出异常?
在 Python2.7 中,首先引发 StopIteration。
【问题讨论】:
-
您可能应该修复错误,但仅供参考,您可以捕获不止一种类型的异常而不捕获所有内容:
except StopIteration, ValueError: do_something() -
酷酷.. 你的问题让我相信你不知道这一点。它写得好像你唯一的选择是捕捉要么
StopIteration或ValueError;不是都。无论如何,我认为 Pieters 先生可能已经解决了下面的实际问题。 -
@jDo,我只想捕获 StopIteration 以停止 while 循环,但如果出现 ValueError,我希望程序停止。如果两者都被捕获并且 ValueError 可能意味着 StopIteration,那就令人困惑了。正如你所说,问题解决了。
-
@JacquesGaudin 看来您正试图在问题本身中为您的问题提供解决方案。这就是 answers 的用途。用对你有用的方法来回答你自己的问题是完全可以的,甚至受到鼓励。
-
好的,我不想对完成大部分工作的 Martijn Pieters 无礼......将创建另一个答案。
标签: python python-3.x iterator map-function