Por que, a seguir, levantamos uma 'StopIteration', mas 'for' faz um retorno normal?

Neste trecho de código, por que usar 'for' não resulta em 'StopIteration' ou o loop 'for' captura todas as exceções e, em seguida, sai silenciosamente? Nesse caso, por que temos o 'retorno' estranho? Ou é oraise StopIteration causado por:return None?

#!/usr/bin/python3.1
def countdown(n):
    print("counting down")
    while n >= 9:
        yield n
        n -= 1
    return

for x in countdown(10):
    print(x)

c = countdown(10)
next(c)
next(c)
next(c)

AssumindoStopIteration está sendo acionado por:return None. Quando o GeneratorExit é gerado?

def countdown(n):
    print("Counting down from %d" % n)
    try:
        while n > 0:
            yield n
            n = n - 1
    except GeneratorExit:
        print("Only made it to %d" % n)

Se eu fizer manualmente um:

c = countdown(10)
c.close() #generates GeneratorExit??

Nesse caso, por que eu não vejo um rastreio?

questionAnswers(1)

yourAnswerToTheQuestion