ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [python] finally
    python 2025. 5. 29. 17:13

    finally

    finally는 Python의 예외 처리 구조에서 사용되는 키워드로, 예외 발생 여부와 관계없이 반드시 실행되어야 하는 코드 블록을 정의할 때 사용됩니다. 주로 자원 정리(예: 파일 닫기, 네트워크 연결 종료 등)에 활용됩니다.

    기본 구조

    try:
        # 예외가 발생할 수 있는 코드
    except SomeException:
        # 예외 처리 코드
    finally:
        # 무조건 실행되는 코드 (자원 정리 등)

     

    예제 1: 파일 처리

    try:
        f = open("example.txt", "r")
        data = f.read()
    except FileNotFoundError:
        print("File not found.")
    finally:
        f.close()  # 파일이 열렸다면 무조건 닫는다
        print("File closed.")

     

    예외가 발생하든 안 하든, finally 블록의 f.close()는 반드시 실행됩니다.

     

    예제 2: 단독 사용

    finally는 try와 함께 단독으로도 사용할 수 있습니다 (예외가 없어도 실행됨).

    try:
        print("Trying something...")
    finally:
        print("Always runs, even if no error.")

     

    요약

    • finally는 예외 발생 여부와 상관없이 항상 실행됨.
    • 자원 정리, 로그 남기기 등에 유용.
    • try-except-finally 또는 try-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("계산기를 이용해 주셔서 감사합니다.")

     

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

     

    퀴즈

    Quiz) 동네에 항상 대기 손님이 있는 맛있는 치킨집이 있습니다.
    대기 손님의 치킨 요리 시간을 줄이고자 자동주문 시스템을 제작하였습니다.
    시스템 코드를 확인하고 적절한 예외처리 구문을 넣으시오.

    조건1 : 1보다 작거나 숫자가 아닌 입력값이 들어올 때는 ValueError로 처리
            출력 메세지 : "잘못된 값을 입력하였습니다."
    조건2 : 대기 손님이 주문할 수 있는 총 치킨량은 10마리로 한정
    치킨 소진시 사용자 정의 에러[SoldOutError]를 발생시키고 프로그램 종료
    출력 메세지 : "재고가 소진되어 더 이상 주문을 받지 않습니다."

    # [코드]
    class SoldOutError(Exception):
        pass
    
    chicken = 10
    waiting = 1 # 홀 안에는 현재 만석, 대기번호 1부터 시작
    while(True):
        try:
            print("[남은 치킨 : {0}]".format(chicken))
            order = int(input("치킨 몇 마리 주문하시겠습니까?"))
            if order > chicken: # 남은 치킨보다 주문량이 많을때
                print("재료가 부족합니다.")
            elif order <= 0:
                raise ValueError
            else:
                print("[대기번호 {0}] {1}마리 주문이 완료되었습니다." \
                    .format(waiting, order))
                waiting += 1
                chicken -= order
                
            if chicken == 0:
                raise SoldOutError
        except ValueError:
            print("잘못된 값을 입력하였습니다.")
        except SoldOutError:
            print("재고가 소진되어 더 이상 주문을 받지 않습니다.")
            break

     

    [남은 치킨 : 10]
    치킨 몇 마리 주문하시겠습니까?8
    [대기번호 1] 8마리 주문이 완료되었습니다.
    [남은 치킨 : 2]
    치킨 몇 마리 주문하시겠습니까?2
    [대기번호 2] 2마리 주문이 완료되었습니다.
    재고가 소진되어 더 이상 주문을 받지 않습니다.

     

    퀴즈2

    1. 예외 처리는 주로 어떤 목적을 위해 사용될까요?

    프로그램이 오류 발생 시 갑자기 멈추는 것을 막기 위해

     

    예상치 못한 오류가 발생하더라도 프로그램이 강제로 종료되지 않고 정상적으로 처리되도록 만들어 프로그램의 안정성을 높이는 것이 예외 처리의 주된 목적이랍니다.

     

    2. ' try` 블록 안의 코드를 실행하다가 오류가 발생하면 어떤 일이 일어날까요?

    발생한 오류를 처리할 수 있는 `except` 블록으로 이동해요.

     

    `try` 블록에서 오류가 발생하면 파이썬은 그 오류에 맞는 `except` 블록을 찾아 코드 실행 흐름을 옮겨요. `except` 블록은 오류를 처리하는 역할을 하죠.

     

    3. 프로그램 실행 중 특정 조건이 만족될 때 개발자가 의도적으로 오류를 발생시키고 싶을 때 사용하는 키워드는 무엇일까요?

    `raise`

     

    `raise` 키워드는 코드가 특정 상태일 때 개발자가 정의한 예외를 강제로 발생시키는 역할을 해요. 이를 통해 오류 상황을 명확하게 알릴 수 있죠.

     

    4. 나만의 사용자 정의 예외(Custom Exception) 클래스를 만들 때, 파이썬의 어떤 내장 클래스를 상속받는 것이 일반적일까요?

    `Exception`

     

    사용자 정의 예외는 기존 예외 시스템을 확장하는 것이므로, 파이썬의 모든 내장 예외들의 기반이 되는 `Exception` 클래스를 상속받아 정의하는 것이 표준적인 방법이에요.

     

    5. `try...except...finally` 구조에서 `finally` 블록 안의 코드는 언제 실행될까요?

    오류 발생 여부나 처리 여부와 관계없이 항상

     

    `finally` 블록에 있는 코드는 `try` 블록 안의 코드가 성공했든, 오류가 나서 `except`로 갔든, 심지어 처리되지 않은 오류가 발생했든 상관없이 프로그램이 종료되기 전에 항상 실행됨이 보장돼요.

     

     

    'python' 카테고리의 다른 글

    [python] 패키지  (1) 2025.06.02
    [python] 모듈  (0) 2025.06.02
    [python] 예외처리  (1) 2025.05.29
    [python] 스타크래프트 프로젝트  (0) 2025.05.29
    [python] super  (0) 2025.05.28
Designed by Tistory.