본문 바로가기

프로그래밍 언어/파이썬

파이썬 사용자 정의 예외 처리, 커스텀 예외 클래스 만들기

파이썬 사용자 정의 예외 처리, 커스텀 예외 클래스 만들기

파이썬에서 예외 처리(Exception Handling)는 코드의 오류를 다루고, 프로그램이 중단되지 않고 적절히 대응할 수 있도록 돕습니다. 기본 제공 예외만으로는 충분하지 않을 때, 커스텀 예외를 만들어 특정 상황에 맞는 예외 처리를 구현할 수 있습니다. 이 글에서는 파이썬에서 사용자 정의 예외를 만드는 방법과 활용법을 심층적으로 분석해보겠습니다.

 

 

 

1. 예외 처리의 기본 개념

예외 처리란 프로그램 실행 중 발생하는 예외 상황(에러)을 관리하는 방법입니다. 파이썬에서는 try, except, else, finally 블록을 사용하여 예외를 처리할 수 있습니다. 예를 들어, 파일을 읽을 때 파일이 존재하지 않으면 FileNotFoundError 예외가 발생합니다.

 

 

2. 기본 예외 클래스 상속하기

파이썬의 모든 예외는 BaseException 클래스를 상속받습니다. 사용자 정의 예외를 만들기 위해서는 Exception 또는 그 하위 클래스를 상속받아야 합니다. 기본적인 사용자 정의 예외 클래스는 다음과 같습니다:

class MyCustomError(Exception):
    pass

 

 

3. 커스텀 예외 클래스 만들기

커스텀 예외 클래스는 다양한 속성과 메서드를 추가하여 더욱 세부적인 예외 처리를 할 수 있습니다. 예를 들어, 에러 메시지와 에러 코드를 포함하는 커스텀 예외 클래스를 만들어 봅시다:

class ValidationError(Exception):
    def __init__(self, message, code):
        super().__init__(message)
        self.code = code

try:
    raise ValidationError("Invalid input", 400)
except ValidationError as e:
    print(f"Error: {e}, Code: {e.code}")

 

 

4. 커스텀 예외 사용하기

커스텀 예외를 사용하면 코드의 가독성을 높이고, 에러 발생 시 보다 구체적인 정보를 제공할 수 있습니다. 이를 통해 디버깅이 용이해지고, 예외 처리가 명확해집니다. 다음은 커스텀 예외를 사용하는 예제입니다:

class InsufficientFundsError(Exception):
    def __init__(self, balance, amount):
        super().__init__(f"Balance of {balance} is insufficient for withdrawal of {amount}")
        self.balance = balance
        self.amount = amount

class BankAccount:
    def __init__(self, initial_balance):
        self.balance = initial_balance

    def withdraw(self, amount):
        if amount > self.balance:
            raise InsufficientFundsError(self.balance, amount)
        self.balance -= amount
        return self.balance

account = BankAccount(100)

try:
    account.withdraw(150)
except InsufficientFundsError as e:
    print(e)

 

 

 

 

5. 실전 예제

사용자 정의 예외는 다양한 상황에서 유용하게 사용될 수 있습니다. 예를 들어, 웹 애플리케이션에서 사용자의 입력을 검증할 때나, 파일 시스템의 상태를 확인할 때 등 다양한 상황에서 커스텀 예외를 통해 코드의 신뢰성을 높일 수 있습니다. 다음은 파일 처리 중 발생할 수 있는 다양한 예외를 커스텀 예외로 처리하는 예제입니다:

class FileProcessingError(Exception):
    pass

class FileNotFoundError(FileProcessingError):
    def __init__(self, filename):
        super().__init__(f"File {filename} not found")
        self.filename = filename

class FileReadError(FileProcessingError):
    def __init__(self, filename):
        super().__init__(f"Error reading file {filename}")
        self.filename = filename

def read_file(filename):
    if not os.path.exists(filename):
        raise FileNotFoundError(filename)
    try:
        with open(filename, 'r') as file:
            return file.read()
    except IOError:
        raise FileReadError(filename)

try:
    content = read_file('example.txt')
except FileProcessingError as e:
    print(e)

 

 

6. 결론

이 글에서는 파이썬에서 사용자 정의 예외를 만드는 방법과 그 활용법을 심층적으로 분석해보았습니다. 커스텀 예외를 사용하면 보다 구체적이고 명확한 예외 처리가 가능해지며, 코드의 유지보수성과 가독성을 크게 향상시킬 수 있습니다. 다양한 상황에 맞는 커스텀 예외를 만들어 코드의 품질을 높여보세요.