🗂️

4.7.9. 예외처리

 

1. 예외

1.1 try ~ except ~ else ~ finally

위와 같이 에러가 발생하는 경우에는 프로그램이 멈추는 등 심각한 문제를 초래할 수 있습니다.
따라서 프로그램이 멈추지 않도록 에러가 발생하지 않도록 처리를 해주어야 합니다.
이를 예외처리라고 합니다.
 

1.2 try

try블록 안에서는 실질적인 프로세스가 진행됩니다.
만약 프로세스 진행 중에 오류가 발생한다면 except블록으로 넘어가 진행됩니다.
정상적인 로직이 실행된다면 except 블록을 건너뜁니다.
 

1.3 except

try블록에서 오류가 발생한다면 넘어와 except에 있는 프로세스가 실행됩니다.
가능하면 except안에서는 오류가 발생할 로직을 설정하지 않는 것이 좋습니다.
except구문이 실행된다면 다음에 있을 else구문(만약 존재한다면)은 건너 뜁니다.
 

1.4 else

정상적인 로직이 실행되었을 때 except구문을 건너뛰고 else구문이 존재한다면 실행됩니다.
좀더 명확히 로직을 나눌 필요가 있을 때 만들면 좋습니다.
 

1.5 finally

항상 최종적으로 실행되는 구문입니다.
except 구문과 마찬가지로 여기에서도 오류가 발생할 로직은 설정하지 않는 것이 좋습니다.
대체로 상황을 초기화를 하거나, 파일 입출력 연결 혹은 데이터베이스 연결을 종료할 때 자주 사용됩니다.
 
먼저 삭제되지 않고 정상적으로 출력되는 상황에 대한 예제입니다.
입력
selected_menu = "Ice Americano" try: print("메뉴를 입력받습니다.") print(selected_menu) except: print("존재하지 않는 메뉴입니다.") else: print("메뉴가 정상 처리 되었습니다.") finally: print("안녕히 가세요!")
 
출력
메뉴를 입력받습니다. 메뉴가 정상 처리 되었습니다. 안녕히 가세요!
 
다음 예제는 메뉴를 입력받았지만, 중간에 삭제되어버렸다고 가정한 내용을 짧게 축약한 것입니다.존재하지 않는 변수를 print 메소드로 출력하지만 에러 메시지가 뜨지 않고, 계속 진행되는 것을 볼 수 있습니다.
입력
selected_menu = "Ice Americano" del selected_menu try: print("메뉴를 입력받습니다.") print(selected_menu) except: print("존재하지 않는 메뉴입니다.") else: print("메뉴가 정상 처리 되었습니다.") finally: print("안녕히 가세요!")
 
출력
메뉴를 입력받습니다. 존재하지 않는 메뉴입니다. 안녕히 가세요!
 

1.6 raise

raise문은 프로그래머가 직접 에러를 발생할 수 있도록 하는 것입니다.
모듈을 작성할 때에 직접 논리적인 오류를 발생시킴으로 개발하는데에 도움을 주거나 혹은 논리적인 오류의 발생을 미연에 방지할 수 있습니다.
입력
raise NameError("잘못된 이름을 가리키고 있습니다.")
 
출력
Traceback (most recent call last): File "/studyLab.py", line 1, in <module> raise NameError("잘못된 이름을 가리키고 있습니다.") NameError: 이름에 대한 에러가 발생했습니다.
 
파이썬에 내장되어 있는 예외는 다음 문서를 참조하시길 바랍니다.
 

1.7 with

with 구문은 ContextManager 프로토콜에 따라 시작시에 __enter__(self)와 종료시에 __exit__(self) 구문을 자동으로 호출해주는 역할을 담당하고 있습니다.
파일을 연결하거나, 데이터베이스에 연결할 때에 사용하면 코드의 길이을 좀더 짧게 줄일 수 있습니다.
try-finally를 활용한 코드
입력
try: menu = open("coffee_menu.txt", mode="wt", encoding="utf-8") menu.write("americano\n") menu.write("mochaccino\n") finally: menu.close()
 
출력
with open("coffee_menu.txt", mode="wt", encoding="utf-8") as menu: menu.write("americano\n") menu.write("mochaccino\n")