파이썬 Raise 사용 방법과 주요 ExceptionType의 특징
파이썬에서 raise 키워드는 예외를 강제로 발생시키기 위해 사용됩니다. 이를 통해 개발자는 코드 실행 중에 예상치 못한 상황이나 오류가 발생했을 때, 명시적으로 예외를 발생시켜 프로그램의 흐름을 제어하고, 해당 상황을 처리할 수 있게 합니다. 그리고 파이썬에는 다양한 내장 예외 타입(ExceptionType)이 있으며, 각각의 예외 타입은 발생할 수 있는 특정한 에러 상황을 나타냅니다. 사용자는 이러한 예외를 활용하여 더 세밀하게 에러를 처리할 수 있습니다.
파이썬 Raise 사용 (이유와 목적)
raise를 사용하는 주요 이유와 목적은 다음과 같습니다.
- 에러 상황 명시: 특정 조건에서 프로그램이 정상적으로 실행될 수 없음을 명시적으로 나타낼 수 있습니다.
- 코드 디버깅 용이: 에러 메시지와 함께 예외를 발생시켜, 문제의 원인을 쉽게 파악할 수 있게 합니다.
- 예외 처리 흐름 제어: 특정 예외를 잡아내어(custom exception handling) 그에 맞는 특수한 처리를 할 수 있게 합니다.
사용 방법
raise를 사용하는 기본 문법은 다음과 같습니다. 여기서 ExceptionType은 발생시키고자 하는 예외의 종류(예: ValueError, TypeError, CustomException 등)이며, "Error message"는 해당 예외 상황에 대한 설명입니다.
raise ExceptionType("Error message")
다음은 raise 사용에 따른 6가지 상황을 보여주는 예제 코드입니다. 아래 예제들은 raise를 사용하여 다양한 상황에서 예외를 명시적으로 발생시키고, 프로그램의 흐름을 적절히 제어하는 방법을 보여줍니다. 예외 처리(try...except)를 적절히 사용하여 이러한 예외를 처리할 수 있습니다.
1. 사용자 정의 예외 발생
class MyCustomError(Exception):
pass
def check_value(x):
if x < 10:
raise MyCustomError("Value must be at least 10")
return x
# 예외를 테스트하려면 다음 코드의 주석을 해제하세요
# check_value(5)
2. 값 검증 시 예외 발생
def set_age(age):
if age < 0:
raise ValueError("Age cannot be negative")
return age
# set_age(-1)
3. 타입 검증 시 예외 발생
def add_numbers(a, b):
if not isinstance(a, (int, float)) or not isinstance(b, (int, float)):
raise TypeError("Both arguments must be int or float")
return a + b
# add_numbers("1", 2)
4. 파일 처리 시 예외 발생
def read_file(filename):
try:
with open(filename, 'r') as f:
return f.read()
except FileNotFoundError:
raise FileNotFoundError(f"The file {filename} does not exist")
# read_file("nonexistent_file.txt")
5. API 호출 시 예외 발생
def fetch_data(api_url):
# 예를 들어, 응답 상태 코드가 404인 경우
status_code = 404 # 예시입니다, 실제 API 호출이 포함되지 않았습니다.
if status_code == 404:
raise ConnectionError("Failed to fetch data: Resource not found")
# fetch_data("http://example.com/api/data")
6. 조건부 로직 에러
def divide_numbers(x, y):
if y == 0:
raise ZeroDivisionError("Cannot divide by zero")
return x / y
# divide_numbers(10, 0)
7. 키 에러
def access_key(dictionary, key):
if key not in dictionary:
raise KeyError("Key does not exist in the dictionary")
return dictionary[key]
# access_key({"a": 1, "b": 2}, "c")
주요 ExceptionType의 특징
아래에는 주요 ExceptionType과 그 특징들 입니다.
예외 타입 | 설명 |
BaseException | 모든 예외의 베이스 클래스 |
Exception | 일반적인 에러를 위한 베이스 클래스 |
ArithmeticError | 수치 연산 에러의 베이스 클래스 |
BufferError | 버퍼 연산에 관련된 에러 |
LookupError | 매핑이나 시퀀스에서 사용할 때 발생하는 에러의 베이스 클래스 |
AssertionError | assert 문이 실패할 때 발생 |
AttributeError | 객체에 존재하지 않는 속성을 참조하려 할 때 발생 |
EOFError | 입력의 끝(End Of File)이 예상보다 일찍 도달했을 때 발생 |
FloatingPointError | 부동소수점 연산 실패시 발생 |
GeneratorExit | 제너레이터(generator)가 종료될 때 발생 |
ImportError | 모듈 가져오기(import) 실패시 발생 |
ModuleNotFoundError | 찾을 수 없는 모듈을 import하려 할 때 발생 |
IndexError | 시퀀스 인덱스가 범위를 벗어날 때 발생 |
KeyError | 매핑(mapping)에서 존재하지 않는 키를 참조할 때 발생 |
KeyboardInterrupt | 사용자가 인터럽트 키(보통 Ctrl+C)를 눌렀을 때 발생 |
MemoryError | 연산 중 메모리 부족이 발생했을 때 |
NameError | 로컬 또는 전역 이름을 찾을 수 없을 때 발생 |
NotImplementedError | 추상 메소드가 자식 클래스에서 구현되지 않았을 때 발생 |
OSError | 시스템 관련 에러 발생시, 주로 파일 시스템 에러 |
OverflowError | 산술 연산의 결과가 너무 커서 표현할 수 없을 때 발생 |
ReferenceError | 약한 참조(weak reference)가 존재하지 않는 객체를 참조할 때 발생 |
RuntimeError | 일반적으로 감지하기 힘든 에러들을 위한 베이스 클래스 |
StopIteration | 이터레이터가 더 이상의 값을 가지지 않을 때 발생 |
SyntaxError | 구문 에러 발생시 |
IndentationError | 잘못된 들여쓰기가 있을 때 발생 |
TabError | 탭과 스페이스가 혼용되어 들여쓰기가 일관되지 않을 때 발생 |
SystemError | 인터프리터 내부에서 에러가 발생했을 때 |
TypeError | 연산이나 함수가 부적절한 타입의 객체에 적용됐을 때 발생 |
UnboundLocalError | 함수 내에서 할당 전에 로컬 변수를 참조하려 할 때 발생 |
ValueError | 연산이나 함수가 올바른 타입이지만 부적절한 값을 가진 인자에 적용됐을 때 발생 |
ZeroDivisionError | 어떤 숫자를 0으로 나누려 할 때 발생 |
'코딩취미 > Python' 카테고리의 다른 글
QGraphicsLineItem, QGraphicsTextItem 인터렉티브 강화 코드 (mouse over/hover/click event 처리) (0) | 2024.05.03 |
---|---|
이미지 파일 및 resource 관리를 위한 qrc 사용 방법 (0) | 2024.05.02 |
pyinstaller .spec 파일 사용 방법 (Analysis, PYZ, EXE) (0) | 2024.04.06 |
pyinstaller 옵션 명령과 exe 생성툴(패키지) 비교 (0) | 2024.04.05 |
selenium4.11.2, python3.9 적용하며 바뀐 것들 : find_element_by_css_selector, Options, Service (0) | 2024.04.03 |