#처리하지 않은 예외에 의한 코루틴 종료
from coroaverager1 import averager
coro_avg = averager()
coro_avg.send(50)
coro_avg.send('spam')
"""
코루틴의 total 변수에 더할 수 없는 'spam'문자열 전송으로 인해서 에러가 발생했고, 코루틴에 알려주는 구분 표시를 전송해서 코루틴을 종료한다.
"""
close()와 thorw()가 코루틴 제어
#코루틴의 예외 처리 방법을 설명하기 위한 제너레이터
class DemoException(Exception):
"""설명에 사용할 예외 유형"""
def demo_exc_handling():
print('-> corotuine started')
while True:
try:
x=yield
except DemoException:
print('*** DemoEXception handeld. Continuing...')
else:
print('-> coroutine received: {!r}'.format(x))
raise RuntimeError('This line should never run.')
#예외를 발생시키지 않는 demo_exec_handling() 활성화 및 종료
exc_coro = demo_exc_handling()
next(exc_coro)
exc_coro.send(11)
exc_coro.close()
from inspect import getgeneratorstate
"""DemoException을 코루틴 안으로 던지면, 이 예외가 처리되어 demo_exc_handling() 코루틴"""
exc_coro = demo_exc_handling()
next(exc_coro)
exc_coro.send(11)
exc_coro.throw(DemoException)
getgeneratorstate(exc_coro)
#자신에게 던져진 예외를 처리할 수 없으면 코루틴 종료
exc_coro = demo_exc_handling()
next(exc_coro)
exc_coro.send(11)
exc_coro.throw(ZeroDivisionError)
getgeneratorstate(exc_coro)
코루틴이 어떻게 종료되든 어떤 정리 코드를 실행해야 하는 경우에는 try/finally 블록 안에 코루틴의 해당 코드를 넣어야 한다.
class DemoException(Exception):
"""설명에 사용할 예외 유형"""
def demo_finally():
print('-> coroutine started')
try:
while True:
try:
x = yield
except DemoException:
print('*** DemoException handled. Continuing..')
print('-> coroutine ending')