-
[python] finallypython 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