handle=open("/tmp/random_data.txt")# IOError가 일어날 수 있음try:data=handle.read()# UnicodeDecodeError가 일어날 수 있음finally:handle.close()# try 이후에 항상 실행
read 메서드에서 발생한 예외는 항상 호출 코드까지 전달
close 메서드 또한 finally 블록에서 실행되는 것이 보장
파일을 열 때 일어나는 예외는 finally 블록에서 처리하지 않아야 하므로 try 블록 앞에서 open을 호출해야 함
else 블록
어떤 예외를 처리하고 어떤 예외를 전달할지를 명확하게 하고 싶을 때: try/except/else를 사용
try 블록이 예외를 일으키지 않으면 else 블록이 실행
else 블록을 사용하면 try 블록의 코드를 최소로 줄이고 가독성을 높일 수 있음
문자열에서 JSON 딕셔너리 데이터를 로드하여 그 안에 든 키 값을 반환하는 예제
defload_json_key(data,key):try:result_dict=json.loads(data)# ValueError가 일어날 수 있음exceptValueErrorase:raiseKeyErrorfromeelse:returnresult_dict[key]# KeyError가 일어날 수 있음
모두 함께 사용하기
복합문 하나로 모든 것을 처리하고 싶다면 try/except/else/finally를 사용
파일에서 수행할 작업 설명을 읽고 처리한 후 즉석에서 파일을 업데이트하는 예제
UNDEFINED=object()defdivide_json(path):handle=open(path,"r+")# IOError가 일어날 수 있음try:# try 블록은 파일을 읽고 처리하는 데 사용data=handle.read()# UnicodeDecodeError가 일어날 수 있음op=json.loads(data)# ValueError가 일어날 수 있음value=(op["numerator"]/op["denominator"])# ZeroDivisionError가 일어날 수 있음exceptZeroDivisionErrorase:# except 블록은 try 블록에서 일어난 예외를 처리하는 데 사용returnUNDEFINEDelse:# else 블록은 파일을 즉석에서 업데이트하고 이와 관련된 예외가 전달되게 하는 데 사용op["result"]=valueresult=json.dumps(op)handle.seek(0)handle.write(result)# IOError가 일어날 수 있음returnvaluefinally:# finally 블록은 파일 핸들을 정리하는 데 사용handle.close()# 항상 실행됨
Comments