2016-06-29 3 views
4
def receiver(): 
    print("Ready to receive") 
# try: 
    while True: 
     n = (yield) 
     print("Got %s" % n) 
# except GeneratorExit: 
#  print("Receiver done") 

r = receiver() 
r.next() 

r.send(10) 

r.close() 

私がGeneratorExitをコメントアウトすると、close()はトレースバックを生成しません!どうして?しかし、exceptがアクティブなので、私はGeneratorExitにキャッチすることができます。そんなことがあるものか?GeneratorExit、close()はトレースバック/例外を発生させません - どのように?

GeneratorExitが例外の場合、他のすべての例外と同様に動作し、実行中であることを伝える必要があります。したがって、exceptを使用してキャッチする能力があります。しかし、確かにexceptがなければ、親のPythonインタプリタは他のすべての例外と同様にトレースバックをキャッチする必要があります。どんな魔法がここにいるの?

+0

「while」はそれを暗黙的にキャッチしているので、 – IanAuld

+0

しかし、 'while'が暗黙的にそれをキャッチしている場合、それを囲むtry/exceptにどのように伝播しますか?彼らはどのようにコミュニケーションをとるのですか(IPC)?とにかく、GeneratorExitについて何も言及していない。 –

答えて

2

generator.close() documentationを参照してください。

StopIterationおよびGeneratorExit例外は、ジェネレータの終了方法を指示するために内部的に使用されているため、呼び出し元に伝播されない唯一の例外です。

GeneratorExit例外を再発生させたい場合は、それを捕まえて別のカスタム例外にカプセル化する必要があります。

関連する問題