1# Test proper handling of exceptions within generator across yield
2def gen():
3    try:
4        yield 1
5        raise ValueError
6    except ValueError:
7        print("Caught")
8    yield 2
9
10for i in gen():
11    print(i)
12
13
14# Test throwing exceptions out of generator
15def gen2():
16    yield 1
17    raise ValueError
18    yield 2
19    yield 3
20
21g = gen2()
22print(next(g))
23try:
24    print(next(g))
25except ValueError:
26    print("ValueError")
27
28try:
29    print(next(g))
30except StopIteration:
31    print("StopIteration")
32
33
34# Test throwing exception into generator
35def gen3():
36    yield 1
37    try:
38        yield 2
39    except ValueError:
40        print("ValueError received")
41        yield 3
42    yield 4
43    yield 5
44
45g = gen3()
46print(next(g))
47print(next(g))
48print("out of throw:", g.throw(ValueError))
49print(next(g))
50try:
51    print("out of throw2:", g.throw(ValueError))
52except ValueError:
53    print("Boomerang ValueError caught")
54