Python 예외 처리 및 예외 클래스 생성
Python에서 예외 처리(Exception Handling)는 프로그램의 오류를 예외적으로 처리하여 중단되지 않고 원활히 실행되도록 하는 중요한 기능입니다. 오늘은 Python 예외 처리의 심화 내용과 예외 클래스를 직접 생성하여 활용하는 방법을 다룹니다.
1. 예외 처리 기본
Python에서는 try
, except
, else
, finally
키워드를 사용하여 예외를 처리할 수 있습니다.
기본 구조
try:
# 예외가 발생할 가능성이 있는 코드
x = int(input("숫자를 입력하세요: "))
result = 10 / x
except ValueError:
print("유효한 숫자를 입력하세요.")
except ZeroDivisionError:
print("0으로 나눌 수 없습니다.")
else:
print(f"결과는 {result}입니다.")
finally:
print("프로그램이 종료되었습니다.")
실행 흐름
try
블록에서 코드 실행 중 예외가 발생하면 해당 예외를 처리할except
블록으로 이동합니다.- 예외가 발생하지 않으면
else
블록이 실행됩니다. - 예외 발생 여부와 상관없이
finally
블록은 항상 실행됩니다.
2. 사용자 정의 예외 클래스
Python에서 표준 예외 클래스만으로 모든 상황을 처리하기 어렵다면, 사용자 정의 예외 클래스를 생성하여 상황에 맞는 예외를 처리할 수 있습니다.
사용자 정의 예외 클래스 생성
사용자 정의 예외 클래스는 Python의 내장 클래스 Exception
을 상속받아 만듭니다.
예제: 특정 값 검증 예외 클래스
class InvalidInputError(Exception):
def __init__(self, message):
self.message = message
super().__init__(self.message)
# 사용자 정의 예외 사용 예
def check_positive_number(value):
if value < 0:
raise InvalidInputError("양수만 입력 가능합니다.")
try:
number = int(input("숫자를 입력하세요: "))
check_positive_number(number)
print(f"입력한 숫자는 {number}입니다.")
except InvalidInputError as e:
print(f"에러 발생: {e}")
사용자 정의 예외의 장점
- 상황에 맞는 구체적인 예외 메시지 제공 가능
- 코드의 가독성과 유지보수성 향상
3. 고급 예외 처리 패턴
3.1 다중 예외 처리
여러 예외를 한 번에 처리하려면 except
뒤에 튜플로 예외를 나열합니다.
try:
x = int(input("숫자를 입력하세요: "))
result = 10 / x
except (ValueError, ZeroDivisionError) as e:
print(f"에러 발생: {e}")
3.2 예외 체인 처리
Python에서는 발생한 예외를 다른 예외로 변환하면서 원래 예외 정보를 유지할 수 있습니다.
try:
raise ValueError("잘못된 값")
except ValueError as e:
raise RuntimeError("런타임 에러 발생") from e
3.3 컨텍스트 관리자와 예외 처리
컨텍스트 관리자(with
문)와 함께 예외를 처리하여 리소스 관리와 오류 방지를 통합할 수 있습니다.
class ManagedFile:
def __init__(self, filename):
self.filename = filename
def __enter__(self):
self.file = open(self.filename, 'w')
return self.file
def __exit__(self, exc_type, exc_value, traceback):
if self.file:
self.file.close()
if exc_type is not None:
print(f"에러 발생: {exc_value}")
return True # 예외를 억제하지 않으려면 False를 반환
# 사용 예
try:
with ManagedFile('test.txt') as file:
file.write("Hello, World!")
raise IOError("파일 쓰기 에러")
except IOError as e:
print(f"파일 처리 중 에러 발생: {e}")
4. 실전 활용 예
4.1 데이터 유효성 검사
데이터 처리 파이프라인에서 유효하지 않은 데이터를 검출하고 예외를 처리합니다.
class DataValidationError(Exception):
pass
def validate_data(data):
if not isinstance(data, dict):
raise DataValidationError("데이터는 반드시 딕셔너리여야 합니다.")
if 'name' not in data or 'age' not in data:
raise DataValidationError("'name'과 'age' 키가 반드시 필요합니다.")
try:
sample_data = {'name': 'Alice'}
validate_data(sample_data)
except DataValidationError as e:
print(f"데이터 검증 실패: {e}")
else:
print("데이터 검증 성공!")
4.2 API 호출 오류 처리
외부 API 호출 시 발생할 수 있는 다양한 오류를 사용자 정의 예외로 처리합니다.
class APIConnectionError(Exception):
pass
class APIResponseError(Exception):
pass
# API 호출 시뮬레이션 함수
def fetch_data_from_api():
raise APIConnectionError("API 서버에 연결할 수 없습니다.")
try:
fetch_data_from_api()
except APIConnectionError as e:
print(f"연결 실패: {e}")
except APIResponseError as e:
print(f"응답 오류: {e}")
5. 정리
Python에서 예외 처리는 단순히 오류를 피하는 것을 넘어, 프로그램의 안정성과 유연성을 높이는 데 매우 중요한 역할을 합니다. 사용자 정의 예외 클래스를 활용하면 더 명확하고 직관적인 코드를 작성할 수 있으며, 복잡한 예외 처리 로직도 간결하게 구현할 수 있습니다.
오늘의 주요 내용 요약
- 예외 처리의 기본 구조와 흐름
- 사용자 정의 예외 클래스 생성 및 활용
- 다중 예외 처리, 예외 체인 처리, 컨텍스트 관리자 활용
- 실전 사례를 통해 본 예외 처리 응용
Python의 강력한 예외 처리 기능을 활용하여 더 견고한 코드를 작성해 보세요!
'Python 고급' 카테고리의 다른 글
Python collections 모듈을 이용한 데이터 구조 (0) | 2024.12.19 |
---|---|
Python datetime과 시간 관리 (0) | 2024.12.18 |
Python 다중 스레드와 병렬 처리 (0) | 2024.12.17 |
Python 메타클래스 이해하기 (0) | 2024.12.15 |
Python 데코레이터와 제너레이터 (0) | 2024.12.14 |