파이썬 - 사용자 정의 예외
안녕하세요, 미래의 파이썬 마법사 여러분! 오늘은 파이썬에서 사용자 정의 예외의 세계로 흥미진진한 여정을 떠날 거예요. 프로그래밍에 새로운 사람이라도 걱정 마세요; 저는 수년간 수업을 하면서 수많은 학생들을 이 모험을 단계별로 안내한 바 있어요. 그럼, 가상의 지팡이(키보드)를 잡고, 함께 뛰어들어봅시다!
파이썬에서 사용자 정의 예외
우리 자신의 예외를 만들기 전에, 예외가 무엇인지 빠르게 정리해봅시다. 맛있는 음식을 만들고 있는 중에 갑자기 필수 재료가 없다는 것을 깨닫는 것과 비슷합니다. 이것은 프로그래밍에서 예외와 비슷합니다 - 코드의 정상적인 흐름을 방해하는 예상치 못한 상황입니다.
파이썬은 ValueError
, TypeError
, ZeroDivisionError
와 같은 많은 내장 예외를 제공합니다. 하지만 때로는 프로그램에서 고유한 상황을 처리하기 위해 우리 자신의 특별한 예외를 만들어야 합니다. 그럴 때는 사용자 정의 예외가 매우 유용합니다!
사용자 정의 예외 만들기
자신의 예외를 만드는 것은 쉽게 만들 수 있는 케이크(음, 쉬운 케이크 레시피)처럼 간단합니다. 내장된 Exception
클래스나 그 서브 클래스들에서 상속받는 새로운 클래스를 만드는 것이 전부입니다. 간단한 예제를 살펴보겠습니다:
class MySpecialError(Exception):
pass
이것이 다예요! 여러분은 처음으로 사용자 정의 예외를 만들었어요. pass
문은 예외 클래스에 추가적인 기능을 추가할 필요가 없기 때문에 사용됩니다.
하지만 예외가 좀 더 정보를 제공하도록 하고 싶다면 어떻게 해야 할까요? 또 다른 예제를 만들어봅시다:
class ValueTooLargeError(Exception):
def __init__(self, message, value):
self.message = message
self.value = value
이 예제에서, 예외 클래스에 __init__
메서드를 추가했습니다. 이를 통해 예외를 발생시킬 때 추가 정보를 전달할 수 있습니다.
사용자 정의 예외 발생시키기
이제 우리는 자신의 사용자 정의 예외를 가지고 있습니다. 이를 코드에서 어떻게 사용할 수 있는지 봅시다. 예외를 발생시키는 것은 잘못된 것을 알리는 경보를 울리는 것과 비슷합니다. 이렇게 하면 됩니다:
def check_value(value):
max_value = 100
if value > max_value:
raise ValueTooLargeError("Value is too large!", value)
print(f"Value {value} is acceptable.")
# Let's try it out
try:
check_value(150)
except ValueTooLargeError as error:
print(f"Oops! {error.message} The value was {error.value}")
이 예제에서, 값이 너무 큰지 확인하고 있습니다. 만약 그렇다면, ValueTooLargeError
를 커스텀 메시지와 실제 값과 함께 발생시킵니다.
사용자 정의 예외 처리하기
사용자 정의 예외를 처리하는 것은 내장 예외를 처리하는 것과 마찬가지입니다. 우리는 신뢰할 수 있는 try
-except
블록을 사용합니다. 이전 예제를 확장해 봅시다:
def process_value(value):
try:
check_value(value)
except ValueTooLargeError as error:
print(f"Error: {error.message} The value {error.value} is not allowed.")
# 여기에 에러를 처리하는 코드를 추가할 수 있습니다, 예를 들어 새로운 값를 요청하는 코드
else:
print("Value processed successfully!")
finally:
print("Value checking complete.")
# 다른 값을 사용해 시도해 봅시다
process_value(50)
process_value(200)
이 코드에서, try
-except
블록을 사용하여 ValueTooLargeError
를 처리하고 있습니다. 또한 예외가 발생하지 않으면 실행되는 else
절과 예외가 발생했든 말든 항상 실행되는 finally
절을 추가했습니다.
완전한 예제
이제 이 모든 것을 더 복잡한 예제에 모두 집어넣어 봅시다. 은행 시스템을 만들어보는 것을 상상해 봅시다:
class InsufficientFundsError(Exception):
def __init__(self, balance, amount):
self.balance = balance
self.amount = amount
self.message = f"Insufficient funds. Balance: ${balance}, Attempted withdrawal: ${amount}"
class NegativeAmountError(Exception):
def __init__(self, amount):
self.amount = amount
self.message = f"Cannot process negative amount: ${amount}"
class BankAccount:
def __init__(self, balance=0):
self.balance = balance
def deposit(self, amount):
if amount < 0:
raise NegativeAmountError(amount)
self.balance += amount
print(f"Deposited ${amount}. New balance: ${self.balance}")
def withdraw(self, amount):
if amount < 0:
raise NegativeAmountError(amount)
if amount > self.balance:
raise InsufficientFundsError(self.balance, amount)
self.balance -= amount
print(f"Withdrew ${amount}. New balance: ${self.balance}")
# Let's use our BankAccount class
account = BankAccount(100)
try:
account.deposit(50)
account.withdraw(30)
account.withdraw(200) # This should raise an InsufficientFundsError
except NegativeAmountError as error:
print(f"Error: {error.message}")
except InsufficientFundsError as error:
print(f"Error: {error.message}")
else:
print("All transactions completed successfully.")
finally:
print(f"Final balance: ${account.balance}")
이 예제에서, BankAccount
클래스를 deposit
및 withdraw
메서드를 가진 것을 만들었습니다. 또한 InsufficientFundsError
와 NegativeAmountError
라는 두 가지 커스텀 예외를 정의했습니다.
계좌에서 보유한 금액보다 더 많은 돈을 인출하려고 시도할 때, InsufficientFundsError
를 발생시킵니다. 음수 금액을 예치하거나 인출하려고 시도할 때, NegativeAmountError
를 발생시킵니다.
이것은 사용자 정의 예외가 코드를 더 읽기 쉽게 만들고, 특정 에러 케이스를 명확하고 조직된 방식으로 처리하는 데 얼마나 유용한か의 뛰어난 예입니다.
결론
축하합니다! 여러분은 파이썬 스킬을 사용자 정의 예외를 배우면서 한 단계 업하셨어요. 이 커스텀 예외는 여러분의 개인적인 에러-캐치어 부대처럼, 코드에서 예상치 못한 일이 발생할 때마다 행동하게 됩니다.
기억하세요, 사용자 정의 예외를 마스터하기의 열쇠는 연습입니다. 다양한 시나리오에 대해 여러분 자신의 예외를 만들어 보고, 곧 전문가처럼 에러를 처리할 수 있을 거예요!
다음은 우리가 다룬 메서드에 대한 빠른 참조 표입니다:
메서드 | 설명 |
---|---|
class CustomError(Exception): |
새로운 예외 클래스를 생성합니다 |
raise CustomError() |
커스텀 예외를 발생시킵니다 |
try: |
try 블록을 시작합니다 |
except CustomError as error: |
특정 커스텀 예외를 캐치합니다 |
else: |
예외가 발생하지 않으면 실행됩니다 |
finally: |
예외가 발생했든 말든 항상 실행됩니다 |
코딩 잘하시고, 예외들이 항상 캐치되길 바랍니다!
Credits: Image by storyset