You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
예외를 호출 스택의 위로 전달해야 하지만 예외가 발생하더라도 정리 코드를 실행해야 하는 경우 사용
deftry_finally_example(filename):
print('* 파일 열기')
handle=open(filename, encoding='utf-8') # OSError가 발생할 수 있음try:
print('* 데이터 읽기')
returnhandle.read() # UnicodeDecodeError가 발생할 수 있음finally:
print('* close() 호출')
handle.close() # try 블록이 실행된 다음에는 항상 이 블록이 실행됨
read 메소드에서 예외가 발생하면 try_finally_example 을 호출한 쪽으로 예외 전달
그 전에 finally 가 있다면 해당 블록에 있는 handle.close() 호출이 먼저
2. else 블록
코드에서 처리할 예외와 호출 스택을 거슬로 올라가며 전달할 예외를 명확히 구분하기 위해 try/catch/else 사용할 것
try 블록에서 예외가 발생하지 않으면 else 블록 실행
try 블록 최소화 가능
importjsondefload_json_key(data, key):
try:
print('* JSON 데이터 읽기')
result_dict=json.loads(data) # ValueError가 발생할 수 있음exceptValueErrorase:
print('* ValueError 처리')
raiseKeyError(key) fromeelse:
print('* 키 검색')
returnresult_dict[key] # KeyError가 발생할 수 있음
UNDEFINED=object()
defdivide_json(path):
print('* 파일 열기')
handle=open(path, 'r+') # OSError가 발생할 수 있음try:
print('* 데이터 읽기')
data=handle.read() # UnicodeDecodeError가 발생할 수 있음print('* JSON 데이터 읽기')
op=json.loads(data) # ValueError가 발생할 수 있음print('* 계산 수행')
value= (
op['numerator'] /op['denominator']) # ZeroDivisionError가 발생할 수 있음exceptZeroDivisionErrorase:
print('* ZeroDivisionError 처리')
returnUNDEFINEDelse:
print('* 계산 결과 쓰기')
op['result'] =valueresult=json.dumps(op)
handle.seek(0) # OSError가 발생할 수 있음handle.write(result) # OSError가 발생할 수 있음returnvaluefinally:
print('* close() 호출')
handle.close() # 어떤 경우든 실행됨