본문 바로가기

Python

5-5. raise와 사용자 정의 예외

파이썬 raise와 사용자 정의 예외


 

안녕하세요! 지난 시간에는 파이썬에서 프로그램 실행 중 발생하는 예외를 try-except 구문으로 안전하게 처리하는 방법을 알아보았습니다. 이제 여러분의 프로그램은 예상치 못한 오류에도 멈추지 않고 유연하게 대응할 수 있게 되었죠!

이번 시간에는 예외 처리의 심화 개념으로, 여러분이 직접 예외를 발생시키거나(raise), 자신만의 **사용자 정의 예외(Custom Exception)**를 만드는 방법에 대해 알아보겠습니다. 이 기능들을 활용하면 프로그램의 오류를 더욱 명확하게 알리고, 특정 상황에서 강제로 프로그램 흐름을 제어할 수 있습니다.


Part 1: raise - 예외 직접 발생시키기

raise 키워드는 특정 조건이 충족될 때 강제로 예외를 발생시키는 데 사용됩니다. 이는 주로 입력값이 유효하지 않거나, 특정 비즈니스 로직에 위배되는 상황이 발생했을 때 프로그램에게 "문제가 생겼으니 이 지점에서 멈추고 처리해라"라고 알리는 역할을 합니다.

1. raise 기본 사용법

Python
 
raise 예외_타입_이름("오류 메시지")
  • 예외_타입_이름: 파이썬이 기본으로 제공하는 예외 타입(예: ValueError, TypeError, FileNotFoundError 등) 또는 사용자 정의 예외를 사용합니다.
  • "오류 메시지": (선택 사항) 예외와 함께 전달될 구체적인 오류 설명 문자열입니다.

예시: 유효하지 않은 나이 입력 시 ValueError 발생

Python
 
# 파일 이름: raise_value_error.py

def set_age(age):
    if not isinstance(age, int): # age가 정수가 아니면
        raise TypeError("나이는 반드시 정수여야 합니다.")
    if age < 0 or age > 150: # 나이 범위가 유효하지 않으면
        raise ValueError("나이는 0에서 150 사이여야 합니다.")
    print(f"나이: {age}세로 설정되었습니다.")

print("--- 나이 설정 프로그램 ---")

try:
    set_age(25) # 정상
    set_age(-5) # ValueError 발생
    set_age(200) # 이 코드는 실행되지 않음 (위에서 이미 ValueError 발생)
except ValueError as e:
    print(f"오류 발생: {e}")
except TypeError as e:
    print(f"오류 발생: {e}")

print("\n--- 다른 입력 테스트 ---")
try:
    set_age("스무살") # TypeError 발생
except ValueError as e:
    print(f"오류 발생: {e}")
except TypeError as e:
    print(f"오류 발생: {e}")

print("프로그램 종료.")

 

[VS Code 터미널 출력]

파이썬 raise 키워드로 ValueError와 TypeError 발생 예시

Part 2: 사용자 정의 예외 (Custom Exception) 만들기

파이썬이 제공하는 기본 예외 타입들(예: ValueError, TypeError 등)만으로는 특정 프로그램의 복잡한 오류 상황을 명확하게 표현하기 어려울 수 있습니다. 이럴 때 개발자가 직접 새로운 예외 타입을 정의하여 사용할 수 있습니다.

1. 사용자 정의 예외 생성 방법

  • 사용자 정의 예외는 파이썬의 내장 Exception 클래스 또는 Exception을 상속받는 다른 예외 클래스를 **상속(Inherit)**받아 만듭니다. (상속 개념은 객체지향 프로그래밍 챕터에서 더 자세히 다룹니다.)
  • 가장 간단하게는 Exception 클래스를 상속받으면 됩니다.

기본 형식:

Python
 
class MyCustomError(Exception):
    # 선택적으로 __init__ 메서드를 재정의하여 추가 메시지나 속성을 넣을 수 있음
    pass # 아무 내용도 없어도 됨

예시: 부족한 잔액 예외 정의 및 사용

Python
 
# 파일 이름: custom_exception.py

# 1. 사용자 정의 예외 클래스 정의
class InsufficientFundsError(Exception):
    """
    잔액이 부족할 때 발생하는 사용자 정의 예외.
    """
    def __init__(self, balance, amount):
        self.balance = balance
        self.amount = amount
        self.message = f"잔액이 부족합니다. 현재 잔액: {balance}원, 요청 금액: {amount}원"
        super().__init__(self.message) # Exception 클래스의 생성자 호출

# 2. 사용자 정의 예외를 사용하는 함수
def withdraw(balance, amount):
    if amount <= 0:
        raise ValueError("출금 금액은 0보다 커야 합니다.")
    if amount > balance:
        raise InsufficientFundsError(balance, amount) # 사용자 정의 예외 발생
    
    new_balance = balance - amount
    return new_balance

# 3. 예외 처리
current_balance = 10000

print(f"현재 잔액: {current_balance}원")

try:
    # 정상 출금
    print("\n--- 5000원 출금 시도 ---")
    current_balance = withdraw(current_balance, 5000)
    print(f"출금 성공! 남은 잔액: {current_balance}원")

    # 잔액 부족으로 인한 예외 발생
    print("\n--- 8000원 출금 시도 ---")
    current_balance = withdraw(current_balance, 8000) # InsufficientFundsError 발생
    print(f"출금 성공! 남은 잔액: {current_balance}원") # 이 줄은 실행되지 않음

except InsufficientFundsError as e: # 사용자 정의 예외 처리
    print(f"오류 발생: {e}")
    print(f"현재 잔액: {e.balance}원") # 예외 객체에 저장된 속성 사용
    print(f"요청 금액: {e.amount}원")
except ValueError as e: # 기본 예외 처리
    print(f"출금 오류: {e}")
except Exception as e:
    print(f"예상치 못한 오류: {e}")

print("\n프로그램 종료.")

 

[VS Code 터미널 출력]

파이썬 사용자 정의 예외 정의 및 처리 예시

Part 3: raise와 사용자 정의 예외의 활용 시기

  • raise 사용 시기:
    • 입력 유효성 검사: 함수나 메서드에 전달된 인자가 기대하는 형식이 아니거나 유효한 범위에 있지 않을 때.
    • 특정 조건 위배: 프로그램의 비즈니스 규칙이나 논리적 제약 조건을 어겼을 때.
    • 예상치 못한 상황: 코드가 더 이상 진행될 수 없는 치명적인 상태에 도달했을 때.
    • 디버깅: 개발 과정에서 특정 조건이 만족되었는지 확인하고 싶을 때.
  • 사용자 정의 예외 사용 시기:
    • 특정 비즈니스 로직 오류 표현: 파이썬 기본 예외로는 설명하기 어려운, 여러분의 프로그램에 특화된 오류 상황을 나타낼 때. (예: 로그인실패Error, 재고부족Error, 사용자정지Error 등)
    • 예외 처리의 명확성: try-except 블록에서 어떤 종류의 오류가 발생했는지 더욱 명확하게 구분하여 처리하고 싶을 때.
    • 오류 정보 추가: 예외 발생 시 오류 메시지 외에 추가적인 정보(예: InsufficientFundsError의 balance와 amount)를 예외 객체에 담아서 처리 블록에서 활용하고 싶을 때.

마무리하며

이번 시간에는 파이썬에서 raise 키워드를 사용하여 직접 예외를 발생시키는 방법과, Exception 클래스를 상속받아 자신만의 사용자 정의 예외를 만드는 방법에 대해 알아보았습니다.

raise는 프로그램의 특정 지점에서 오류 상황을 명시적으로 알릴 때 사용되며, 사용자 정의 예외는 여러분의 프로그램에 특화된 오류를 더욱 구체적이고 명확하게 표현할 수 있게 해줍니다. 이 기능들을 잘 활용하면 프로그램을 더욱 견고하고 이해하기 쉽게 만들 수 있습니다.

이것으로 '파일 입출력 & 예외 처리' 챕터의 모든 포스팅이 마무리됩니다. 다음 챕터부터는 파이썬 프로그래밍의 강력한 패러다임인 **객체지향 프로그래밍(OOP)**에 대해 본격적으로 알아보겠습니다. 그 첫걸음으로 클래스와 객체의 개념을 배우게 될 것입니다.


궁금한 점이 있다면 언제든지 질문해주세요! 다음 포스팅에서 만나요!

반응형

'Python' 카테고리의 다른 글

6-5. 상속과 다형성  (0) 2025.07.01
6-2. 생성자(__init__)와 인스턴스 변수  (0) 2025.06.29
5-4. 예외 처리 try-except 구문  (0) 2025.06.28
5-3. CSV 파일 다루기  (0) 2025.06.27
5-2. 파일 쓰기(write, with 구문)  (0) 2025.06.27