티스토리 뷰

옷 가게에서 마음에 드는 옷을 사고 매장을 나서면 매장 직원은 친절하게 감사하다는 인사를 전합니다. 하지만 때로는 마음에 든다고 생각했던 옷을 피팅룸에서 막상 입어보니 잘 어울리지 않는 경우도 있지요. 이런 경우 옷을 하나도 구매하지 않고 매장을 나서게 되지만 그래도 매장 직원은 친절하게 감사하다는 인사를 전합니다. 옷을 사도, 사지 않아도 늘 친절하게 감사하다고 하니 그 친절이 고마워서라도 왠지 다음 번 매장을 방문할때는 꼭 옷을 하나 사야지 하는 마음이 생기곤 합니다.

 

try 구문을 사용할 때 finally 라는 게 있습니다. finally 는 try 구문 내에서 에러가 발생하건 말건 try 를 벗어나는 시점에 무조건 실행되는 구문입니다. finally 는 try 와 except 로 이루어진 구문의 맨 밑에 정의합니다.

try:
    실행 명령문1
    실행 명령문2
    ...
except 에러 종류1:
    예외 처리 명령문1
    예외 처리 명령문2
    ...

except 에러 종류2:
    예외 처리 명령문1
    예외 처리 명령문2
    ...
finally:
    실행 명령문1
    실행 명령문2
    ...

 

앞에서 만든 계산기 프로그램의 맨 밑에 finally 구문을 추가하도록 하겠습니다. 계산기를 이용해준 모든 분들께 감사하다는 인사 메시지를 출력하도록 합니다.

class BigNumberError(Exception):
    def __init__(self, msg):
        self.msg = msg

    def __str__(self):
        return self.msg

try:
    print("한 자리 숫자 나누기 전용 계산기입니다.")
    num1 = int(input("첫 번째 숫자를 입력하세요: "))
    num2 = int(input("두 번째 숫자를 입력하세요: "))
    if num1 >= 10 or num2 >= 10:
        raise BigNumberError("입력값 : {0}, {1}".format(num1, num2))
    print("{0} / {1} = {2}".format(num1, num2, int(num1 / num2)))
except ValueError:
    print("잘못된 값을 입력하였습니다. 한 자리 숫자만 입력하세요.")
except BigNumberError as err:
    print("에러가 발생하였습니다. 한 자리 숫자만 입력하세요.")
    print(err)
finally: # 에러 발생 여부 상관 없이 항상 실행
    print("계산기를 이용해 주셔서 감사합니다.")

 

프로그램을 실행시키고 6 과 2 를 순서대로 입력하여 정상적으로 계산이 되도록 합니다.

한 자리 숫자 나누기 전용 계산기입니다.
첫 번째 숫자를 입력하세요: 6
두 번째 숫자를 입력하세요: 2
6 / 2 = 3
계산기를 이용해 주셔서 감사합니다.

올바른 계산 결과와 함께 finally 에 정의한 print() 가 실행되는 것을 볼 수 있네요.

 

이번에는 일부러 에러를 발생시키기 위해 10 과 5 를 순서대로 입력합니다.

한 자리 숫자 나누기 전용 계산기입니다.
첫 번째 숫자를 입력하세요: 10
두 번째 숫자를 입력하세요: 5
에러가 발생하였습니다. 한 자리 숫자만 입력하세요.
입력값 : 10, 5
계산기를 이용해 주셔서 감사합니다.

그랬더니 에러가 발생하고 한 자리 숫자만 입력하라는 에러 메시지와 함께 finally 구문이 실행되는 것을 볼 수 있습니다.

 

이와 같이 try 구문의 마지막에 finally 를 추가함으로써 에러 발생 여부 상관 없이 항상 실행되는 코드를 작성할 수 있는데, 일반적으로 try 구문 내에서 파일이나 자원을 사용한 경우 finally 구문에서 열린 파일을 닫거나 자원을 해제하는 작업을 수행합니다. 이렇게 하면 프로그램이 실행되는 과정에서 에러가 발생하고 올바른 예외처리가 되지 않은 경우라도 항상 자원이 정상적으로 해제되는 것을 보장할 수 있습니다.

 

마치 시험을 앞둔 어느 학생이 쉬는 시간에 여러 책을 마구 펼쳐놓고 열심히 공부하다가 시험 시간이 되면 공부가 끝나건 말건 상관 없이 모든 책을 덮는 것과 비슷하다고 이해하시면 됩니다. 이 때 쉬는 시간이 try 구문이 실행되는 부분이며 시험 시간이 try 구문 탈출과 함께 실행되는 finally 구문이 됩니다.

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/04   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
글 보관함