나는 코 루틴 (강화 된 발전기)가에 "무시 예외는"데이터의 종료 후 실행되는 간단히 인쇄하십시오 :피 몇 가지 코드를 파이썬 파이썬 강화 발전기
Exception ValueError: ValueError() in <generator object mycoroutine at 0x2b59dfa23d20> ignored
호출자에서 예외를 잡을 수있는 방법이 있습니까?
나는 코 루틴 (강화 된 발전기)가에 "무시 예외는"데이터의 종료 후 실행되는 간단히 인쇄하십시오 :피 몇 가지 코드를 파이썬 파이썬 강화 발전기
Exception ValueError: ValueError() in <generator object mycoroutine at 0x2b59dfa23d20> ignored
호출자에서 예외를 잡을 수있는 방법이 있습니까?
예외 은입니다. 발전기가 닫히면 finally
블록이 실행됩니다. 생성기를 닫으려면 생성자 컨텍스트에서 GeneratorExit
exception을 발생시켜야합니다.
생성기가 삭제 될 때까지 (이 경우 자동으로 파이썬이 종료 될 때) 생성기가 닫히지 않으므로 예외가 무시됩니다. 발전기 __del__
핸들러는 finally:
블록 트리거 발전기, 종료 : 정리 중에 제기 예외가 항상 무시됩니다
>>> def mycoroutine():
... try:
... while True:
... data = (yield)
... print data
... finally:
... raise ValueError
... print "END"
...
>>> co = mycoroutine()
>>> co.next()
>>> co.close()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 7, in mycoroutine
ValueError
>>> co = mycoroutine()
>>> co.next()
>>> del co
Exception ValueError: ValueError() in <generator object mycoroutine at 0x1046a9fa0> ignored
을;
경고 : 다음
이object.__del__()
documentation를 참조 인해 자신의 실행 중에 발생하는 불안정한__del__()
방법은 호출되는 아래 상황, 예외로하고 있습니다 무시하고 경고 대신sys.stderr
에 인쇄됩니다.>>> co = mycoroutine() >>> co.next() >>> try: ... co.close() ... except ValueError: ... pass ... >>> del co >>> # No exception was raised ...
당신은 또한
GeneratorExit
예외를 잡을 수있는 몇 가지 정리를 수행 :
이 솔루션은 발전기가 정리 될 때 예외가 제기되고 있고, 또는 명시 적으로 발전기를 닫아 예외를 catch하지 않는 것입니다 그 시점에서 :
def mycoroutine():
try:
while True:
data = (yield)
print data
except GeneratorExit:
print "Generator exiting!"
하지만주의 StopIteration
또는 GeneratorExit
항상 전파됩니다 이외의 예외가; generator.close()
documentation 참조 : 발전기 함수 다음 StopIteration
을 일으키면
을 (일반적으로 끝낼 인해 또는 이미 폐쇄하기 위해) 또는
GeneratorExit
, 호출자에 가까운 복귀 (예외를 포획하지 않음으로써). 발전기가 값을 산출하면RuntimeError
가 발생합니다. 생성자가 다른 예외를 발생 시키면 호출자에게 전달됩니다.
'finally'를'GeneratorExit : except '로 대체하면 똑같은 일이 발생합니다. 나는 그것이 같다고 생각합니다 ... – Zac
@Zac : 당연히 당신은 여전히 * ValueError를 올립니다. 'GeneratorExit'을 잡아서 다른 예외를 발생 시킨다고해서 그 예외가 전파되는 것을 막을 수는 없습니다. –