본문 바로가기
코딩취미/Python

파이썬 Raise 사용 방법과 주요 ExceptionType의 특징

by 브링블링 2024. 4. 11.
728x90

파이썬 Raise 사용 방법과 주요 ExceptionType의 특징

파이썬에서 raise 키워드는 예외를 강제로 발생시키기 위해 사용됩니다. 이를 통해 개발자는 코드 실행 중에 예상치 못한 상황이나 오류가 발생했을 때, 명시적으로 예외를 발생시켜 프로그램의 흐름을 제어하고, 해당 상황을 처리할 수 있게 합니다. 그리고 파이썬에는 다양한 내장 예외 타입(ExceptionType)이 있으며, 각각의 예외 타입은 발생할 수 있는 특정한 에러 상황을 나타냅니다. 사용자는 이러한 예외를 활용하여 더 세밀하게 에러를 처리할 수 있습니다.

파이썬 Raise 사용 (이유와 목적)

raise를 사용하는 주요 이유와 목적은 다음과 같습니다.

  1. 에러 상황 명시: 특정 조건에서 프로그램이 정상적으로 실행될 수 없음을 명시적으로 나타낼 수 있습니다.
  2. 코드 디버깅 용이: 에러 메시지와 함께 예외를 발생시켜, 문제의 원인을 쉽게 파악할 수 있게 합니다.
  3. 예외 처리 흐름 제어: 특정 예외를 잡아내어(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")
728x90

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으로 나누려 할 때 발생

 

728x90