python 试试 except yield 组合

python try except yield combination

我使用函数 f 创建生成器,但有时它会引发错误。我希望主代码发生两件事

  1. 捕获到错误后,主块中的for循环继续
  2. 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