본문 바로가기
IT/파이썬 기초 (Python)

#040 파이썬 기초 - 예외 처리 III

by DoitSQL 2023. 3. 23.
728x90

Python기초강의강좌, 파이썬기초강의강좌, try.. finally, with

#040 파이썬 기초 - 예외 처리 III

예외 처리 III

지난 시간에 예외를 발생시키는 방법에 대해서 배웠습니다.

이번 시간에는 Try... Finally 문, with 문에 대해서 알아보겠습니다.


Try... Finally 문

프로그램이 파일을 읽고 있는 상황을 가정해 봅시다. 이때 예외가 발생할 경우, 예외의 발생 여부와 상관없이 파일 객체를 항상 닫아 주도록 할 수는 없을까요? 이를 위해 finally 블록을 사용합니다.

 

예제 ( exceptions_finally.py로 저장하세요)

# Filename : exceptions_finally.py
# -*- coding:utf-8 -*-
import sys
import time

f = None
try:
    # 파일 읽기 모드로 open
    f = open("poem.txt")
    while True:
        line = f.readline()
        if len(line) == 0:
            break
        print(line, sys.stdout.flush())
        print("Press ctrl+c now")
        # 2초 대기
        time.sleep(2)
except IOError:
    print("Could not find file poem.txt")
except KeyboardInterrupt:
    print("!! You cancelled the reading from the file.")
finally:
    if f:
        f.close()
    print("(Cleaning up: Closed the file)")

 ▶ 실행 결과:

C:\Anaconda\envs\study_39\python.exe E:\python_study\exceptions_finally.py
봄의 도착
 None
Press ctrl+c now

 None
Press ctrl+c now
겨울이 지나가고 서리가 그치면
 None
Press ctrl+c now
!! You cancelled the reading from the file.
(Cleaning up: Closed the file)

▶ 동작 원리:

아주 평범한 파일을 읽는 코드를 작성하였지만, 파일에서 한 줄을 읽어올 때마다 time.sleep 함수를 호출하여 2초씩 멈추게 하는 인위적인 코드를 집어넣어 프로그램이 천천히 실행되도록 해 주었습니다 (파이썬은 원래 굉장히 빠릅니다). 프로그램이 실행중일 때, ctrl + c를 눌러 프로그램을 강제로 중단시켜 봅시다.

 

그러면 KeyboardInterrupt 예외가 발생되며 프로그램이 종료됩니다. 그러나 프로그램이 종료되기 전에 finally 절이 실행되므로 파일 객체가 항상 닫히게 됩니다.

 

여기서 print 문 뒤에 sys.stdout.flush()를 사용하여 화면에 결과를 바로바로 출력하도록 해 주었습니다.

 

프로그램 실행중 ctrl+c 키가 안먹는 경우 : 파이참 실행구성 펀집에서 '출력 콘솔에서 터이멀 에뮬레이션'에 체크 하세요.

실행 구성
실행 구성


with 문

try 블록에서 시스템 자원을 가져오고 finally 문에서 이를 해제하여 주는 것은 공통된 패턴입니다. 그렇지만, with 문을 이용하면 이것을 좀 더 깔끔하게 작성해 줄 수 있습니다.

 

예제 ( exceptions_using_with.py로 저장하세요. )

# Filename : exceptions_using_with.py
# -*- coding:utf-8 -*-
with open("poem.txt") as f:
    for line in f:
        print(line,end='')

▶ 실행 결과:

C:\Anaconda\envs\study_39\python.exe E:\python_study\exceptions_using_with.py
봄의 도착

겨울이 지나가고 서리가 그치면
새로운 계절이 살아나고
푸르른 빛깔과 향기로운 향기로
다툼을 그치게 한다.

나무의 꽃봉오리가 피기 시작한다.
새들은 둥지로 돌아오고
태양은 하늘에서 더 밝게 빛나고
따뜻함이 넘치고 축복이 내린다.

땅은 잠에서 깨어나고
꽃들은 산들바람에 춤춘다,
세상은 새로운 희망으로 가득 차고
생명은 움트기 시작한다.

낮은 길어지고 밤은 짧아지고
그리고 자연은 살아나고
봄의 기쁨은 사방에 기득차고
경이로움이 되살아 난다.

그러니 봄을 기쁨으로 맞이하자.
그리고 그 탄생을 축하하자.
새로운 세상을 만들어내는 봄
그 아름다움을 만끽하자.

▶ 동작 원리:

위 예제는 이전의 예제와 동일한 결과를 출력합니다. 차이점은 open 함수를 사용할 때 with 문을 사용하였다는 것입니다. 그러면 파일을 직접 닫아 주지 않아도 with open 이 자동으로 파일을 닫아 줍니다.

 

그러면 with 문은 어떻게 자동으로 이러한 것들을 처리해 주는 것일까요? 우선 with 문은 open문이 반환해 주는 객체를 받아 오는데, 일단 여기서는 이것을 "thefile"이라고 해 봅시다.

 

with 문은 항상 thefile.enter 함수를 호출한 뒤 해당 블록의 코드를 실행하며, 실행이 끝난 후에는 항상 thefile.exit 가 호출됩니다.

 

따라서 finally 블록에 써 준 코드가 exit 메서드에 의해 자동적으로 다루어져야 할 경우에만 이를 사용할 수 있을 것입니다. 이런 경우, 위 방법대로 하면 매번 try... finally 문을 명시적으로 쓰지 않고도 같은 일을 할 수 있습니다.


요약

지금까지 try.. except 문과 try.. finally 문의 사용법을 배워 보았습니다. 또 사용자 정의 예외 형식을 만드는 법과 예외를 일으키는 법에 대해서도 알아보았습니다.


다음 시간에는 파이썬 표준 라이브러리에 대해 알아보겠습니다.

 

감사합니다.

 

Do it! SQL을 찾아 주셔서 감사합니다. ♥ 댓글이 큰 힘이 됩니다.

 

 

728x90

댓글