2013-09-05 4 views
6

나는 코 루틴 (강화 된 발전기)가에 "무시 예외는"데이터의 종료 후 실행되는 간단히 인쇄하십시오 :피 몇 가지 코드를 파이썬 파이썬 강화 발전기

Exception ValueError: ValueError() in <generator object mycoroutine at 0x2b59dfa23d20> ignored 

호출자에서 예외를 잡을 수있는 방법이 있습니까?

답변

9

예외 입니다. 발전기가 닫히면 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가 발생합니다. 생성자가 다른 예외를 발생 시키면 호출자에게 전달됩니다.

+0

'finally'를'GeneratorExit : except '로 대체하면 똑같은 일이 발생합니다. 나는 그것이 같다고 생각합니다 ... – Zac

+0

@Zac : 당연히 당신은 여전히 ​​* ValueError를 올립니다. 'GeneratorExit'을 잡아서 다른 예외를 발생 시킨다고해서 그 예외가 전파되는 것을 막을 수는 없습니다. –

관련 문제