메타클래스를 사용하여 사용자 정의 예외 클래스를 생성하면, 공통적인 동작이나 속성을 예외 클래스에 자동으로 추가할 수 있습니다. 이를 통해 예외 메시지 형식을 통일하거나, 추가적인 메타데이터를 포함하는 예외 클래스를 손쉽게 관리할 수 있습니다.
사용자 정의 예외 메타클래스 코드
class ExceptionMeta(type):
"""메타클래스를 사용하여 공통 동작을 추가하는 사용자 정의 예외 클래스"""
def __new__(cls, name, bases, dct):
# 공통 속성 추가
dct.setdefault("default_message", "An error occurred.")
dct.setdefault("error_code", 1000)
return super().__new__(cls, name, bases, dct)
def __call__(cls, *args, **kwargs):
"""인스턴스 생성 시 메시지 형식을 통일"""
instance = super().__call__(*args, **kwargs)
if not hasattr(instance, "formatted_message"):
instance.formatted_message = f"[{cls.error_code}] {instance.args[0] if instance.args else cls.default_message}"
return instance
class CustomException(Exception, metaclass=ExceptionMeta):
"""기본 사용자 정의 예외 클래스"""
pass
class ValidationError(CustomException):
"""검증 오류"""
default_message = "Validation failed."
error_code = 2001
class DatabaseError(CustomException):
"""데이터베이스 오류"""
default_message = "A database error occurred."
error_code = 3001
# 사용 예제
if __name__ == "__main__":
try:
raise ValidationError("Invalid data provided.")
except ValidationError as e:
print(f"ValidationError caught: {e.formatted_message}")
try:
raise DatabaseError()
except DatabaseError as e:
print(f"DatabaseError caught: {e.formatted_message}")
try:
raise CustomException()
except CustomException as e:
print(f"CustomException caught: {e.formatted_message}")
코드 설명
- ExceptionMeta 메타클래스:
- **default_message**와 **error_code**를 기본적으로 예외 클래스에 추가.
- __call__ 메서드를 재정의하여 예외 인스턴스를 생성할 때 메시지 형식을 통일.
- 각 예외 클래스에서 별도로 정의하지 않으면 default_message와 error_code가 기본값으로 사용됨.
- CustomException:
- 모든 사용자 정의 예외 클래스의 기본 클래스.
- ExceptionMeta 메타클래스를 사용하여 공통 속성과 동작을 상속받음.
- 파생 클래스 (ValidationError, DatabaseError):
- 각 예외 클래스는 default_message와 error_code를 재정의하여 고유한 정보를 제공.
- 사용 예제:
- ValidationError와 DatabaseError를 각각 생성하며 메시지를 출력.
- 기본 CustomException도 동일한 방식으로 동작.
실행 결과 (예시):
ValidationError caught: [2001] Invalid data provided.
DatabaseError caught: [3001] A database error occurred.
CustomException caught: [1000] An error occurred.
주요 기능
- 공통 속성 관리: default_message와 error_code를 메타클래스를 통해 자동으로 추가.
- 통일된 메시지 형식: 예외 메시지가 자동으로 포맷팅되어 관리 용이.
- 확장성: 새로운 예외 클래스가 메타클래스의 공통 동작을 쉽게 상속받을 수 있음.
이 코드는 애플리케이션의 다양한 예외 상황을 통일된 방식으로 처리하고, 개발 및 디버깅을 쉽게 하는 데 유용합니다.
'데이터 카드 자료구조' 카테고리의 다른 글
[데이터 카드 자료구조] 푸터 카드를 생성하기 위한 메타클래스 (0) | 2025.01.07 |
---|---|
[데이터 카드 자료구조] 헤더 카드를 생성하기 위한 메타클래스 (0) | 2025.01.07 |
[데이터 카드 자료구조] 히스토리 메타클래스 샘플 코드 (0) | 2025.01.07 |
[데이터 카드 자료구조] 히스토리 보조 카드 샘플 코드 (0) | 2025.01.07 |
[데이터 카드 자료구조] 데이터카드 콘테이터 클래스 샘플 코드 (0) | 2025.01.07 |