더북(TheBook)

모두 함께 사용하기

복합문 하나로 모든 것을 처리하고 싶다면 try/except/else/finally를 사용하면 된다. 예를 들어 파일에서 수행할 작업 설명을 읽고 처리한 후 즉석에서 파일을 업데이트한다고 하자. 여기서 try 블록은 파일을 읽고 처리하는 데 사용한다. except 블록은 try 블록에서 일어난 예외를 처리하는 데 사용한다. else 블록은 파일을 즉석에서 업데이트하고 이와 관련한 예외가 전달되게 하는 데 사용한다. finally 블록은 파일 핸들을 정리하는 데 사용한다.

UNDEFINED = object()

 

def divide_json(path):

handle = open(path, ‘r+’)      # IOError가 일어날 수 있음

try:

data = handle.read()   # UnicodeDecodeError가 일어날 수 있음

op = json.loads(data)  # ValueError가 일어날 수 있음

value = (

op['numerator'] /

op['denominator']) # ZeroDivisionError가 일어날 수 있음

except ZeroDivisionError as e:

return UNDEFINED

else:

op[‘result’] = value

result = json.dumps(op)

handle.seek(0)

handle.write(result)   # IOError가 일어날 수 있음

return value

finally:

handle.close()         # 항상 실행함

 

이 레이아웃은 모든 블록이 직관적인 방식으로 엮여서 동작하므로 특히 유용하다. 예를 들어 결과 데이터를 재작성하는 동안에 else 블록에서 예외가 일어나도 finally 블록은 여전히 실행되어 파일 핸들을 닫는다.

 

핵심 정리

try/finally 복합문을 이용하면 try 블록에서 예외 발생 여부와 상관없이 정리 코드를 실행할 수 있다.

else 블록은 try 블록에 있는 코드의 양을 최소로 줄이는 데 도움을 주며 try/except 블록과 성공한 경우에 실행할 코드를 시각적으로 구분해준다.

else 블록은 try 블록의 코드가 성공적으로 실행된 후 finally 블록에서 공통 정리 코드를 실행하기 전에 추가 작업을 하는 데 사용할 수 있다.

신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.