코루틴 종료와 예외 처리

매일 공부(ML)·2023년 5월 9일
0

Fluent Python

목록 보기
117/130

제어 흐름

코루틴

코루틴 종료와 예외 처리

#처리하지 않은 예외에 의한 코루틴 종료

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')
profile
성장을 도울 아카이빙 블로그

0개의 댓글