python 试试 except yield 组合
python try except yield combination
我使用函数 f
创建生成器,但有时它会引发错误。我希望主代码发生两件事
- 捕获到错误后,主块中的
for
循环继续
- 在
except
中,打印出产生错误的索引(实际上索引3可能不会出现错误)
我想出的代码在出现错误后停止。如何实现上述两个特性?非常感谢。
def f(n):
for i in xrange(n):
if i == 3:
raise ValueError('hit 3')
yield i
if __name__ == '__main__':
a = enumerate(f(10))
try:
for i, x in a:
print i, x
except ValueError:
print 'you have a problem with index x'
如果您希望生成器的循环继续 运行,您必须在生成器内部捕获异常 。这是一个工作示例:
def f(n):
for i in xrange(n):
try:
if i == 3:
raise ValueError('hit 3')
yield i
except ValueError:
print ("Error with key: {}".format(i))
像你的例子一样遍历它给出:
>>> for i in f(10):
... print (i)
...
0
1
2
Error with key: 3
4
5
6
7
8
9
根据 OP 的说明,他想在生成器内部发生错误的情况下继续 outside main for 循环,显示错误发生在哪个索引处。
brianpck 的回答采用了修改生成器的方法,以便打印错误。这样主循环就不知道在该索引处发生了错误,因此您在索引 x-1 处有错误之后的结果。有时您会关心假设 "one index <-> one result".
为了解决这个问题,我们可以通过产生错误然后决定在生成器中做什么来手动管理错误。
点赞:
def f(n):
for i in xrange(n):
if i == 3:
yield ValueError('hit 3')
continue # or break, depends on problem logic
yield i
if __name__ == '__main__':
a = enumerate(f(10))
for i, x in a:
if isinstance(x, ValueError):
print "Error at index", i
continue
print i, x
通常生成器不太可能产生异常 类,因此检查结果是否为异常并进行处理是安全的。
我怀疑,一般来说,您希望能够捕获导致错误情况的值。无需停止生成器内的循环。这是另一种方法,它在生成器的结果中包含一个布尔值(作为二元组),指示计算是否可以成功完成。
def f(n):
for i in range(n):
accept=True
try:
result=1/(3-i)
except:
accept=False
yield accept, i
a=enumerate(f(10))
for k,(ok,i) in a:
print (ok,i)
在这种情况下,只有值 3 会导致失败。这是输出。
True 0
True 1
True 2
False 3
True 4
True 5
True 6
True 7
True 8
True 9
我使用函数 f
创建生成器,但有时它会引发错误。我希望主代码发生两件事
- 捕获到错误后,主块中的
for
循环继续 - 在
except
中,打印出产生错误的索引(实际上索引3可能不会出现错误)
我想出的代码在出现错误后停止。如何实现上述两个特性?非常感谢。
def f(n):
for i in xrange(n):
if i == 3:
raise ValueError('hit 3')
yield i
if __name__ == '__main__':
a = enumerate(f(10))
try:
for i, x in a:
print i, x
except ValueError:
print 'you have a problem with index x'
如果您希望生成器的循环继续 运行,您必须在生成器内部捕获异常 。这是一个工作示例:
def f(n):
for i in xrange(n):
try:
if i == 3:
raise ValueError('hit 3')
yield i
except ValueError:
print ("Error with key: {}".format(i))
像你的例子一样遍历它给出:
>>> for i in f(10):
... print (i)
...
0
1
2
Error with key: 3
4
5
6
7
8
9
根据 OP 的说明,他想在生成器内部发生错误的情况下继续 outside main for 循环,显示错误发生在哪个索引处。
brianpck 的回答采用了修改生成器的方法,以便打印错误。这样主循环就不知道在该索引处发生了错误,因此您在索引 x-1 处有错误之后的结果。有时您会关心假设 "one index <-> one result".
为了解决这个问题,我们可以通过产生错误然后决定在生成器中做什么来手动管理错误。
点赞:
def f(n):
for i in xrange(n):
if i == 3:
yield ValueError('hit 3')
continue # or break, depends on problem logic
yield i
if __name__ == '__main__':
a = enumerate(f(10))
for i, x in a:
if isinstance(x, ValueError):
print "Error at index", i
continue
print i, x
通常生成器不太可能产生异常 类,因此检查结果是否为异常并进行处理是安全的。
我怀疑,一般来说,您希望能够捕获导致错误情况的值。无需停止生成器内的循环。这是另一种方法,它在生成器的结果中包含一个布尔值(作为二元组),指示计算是否可以成功完成。
def f(n):
for i in range(n):
accept=True
try:
result=1/(3-i)
except:
accept=False
yield accept, i
a=enumerate(f(10))
for k,(ok,i) in a:
print (ok,i)
在这种情况下,只有值 3 会导致失败。这是输出。
True 0
True 1
True 2
False 3
True 4
True 5
True 6
True 7
True 8
True 9