프로그래밍/Python

파이썬 사용자 정의 예외: 프로그램 안정성을 높이는 방법

shimdh 2025. 2. 25. 13:37
728x90

소프트웨어 개발을 하다 보면 예상치 못한 오류가 발생하는 것은 피할 수 없는 일입니다. 예외 처리(Exception Handling) 는 이러한 오류를 효과적으로 관리하여 프로그램이 갑작스럽게 종료되지 않도록 하는 중요한 기법입니다.

파이썬에서는 다양한 내장 예외(Built-in Exceptions) 를 제공하여 일반적인 오류를 처리할 수 있습니다. 하지만 내장 예외만으로 해결할 수 없는 특정한 상황이 존재합니다. 예를 들어, 사용자 입력이 특정 조건을 만족해야 하거나, 비즈니스 로직에 맞는 오류 처리가 필요할 때 사용자 정의 예외(Custom Exceptions) 를 활용하면 더욱 직관적이고 명확한 오류 처리를 구현할 수 있습니다.

이번 글에서는 파이썬 예외 처리의 기본 개념과 사용자 정의 예외를 활용하는 방법을 자세히 알아보겠습니다.


1. 예외 처리란?

1.1 예외(Exception)와 오류(Error)의 차이

오류(Error) 는 프로그램이 더 이상 실행될 수 없는 치명적인 문제를 의미합니다. 예를 들어, 문법 오류(SyntaxError)와 같은 경우 코드 자체가 실행되지 않습니다.

반면, 예외(Exception) 는 실행 도중 발생하는 문제로, 적절한 처리를 통해 프로그램을 계속 실행할 수 있습니다. 예를 들어, 사용자가 잘못된 입력을 했을 때 적절한 예외 처리를 한다면 프로그램을 정상적으로 유지할 수 있습니다.

1.2 예외 처리가 필요한 이유

  • 프로그램 안정성 증가: 예상치 못한 오류로 인해 프로그램이 강제 종료되지 않도록 방지
  • 사용자 경험(UX) 향상: 오류 메시지를 제공하여 사용자가 문제를 쉽게 이해하고 해결할 수 있도록 도움
  • 코드 유지보수 용이: 예외 처리를 통해 오류 발생 지점을 빠르게 파악 가능
  • 데이터 손실 방지: 파일, 데이터베이스, 네트워크 작업 중 예외 발생 시 적절한 처리를 통해 데이터 손실을 방지

2. 내장 예외와 기본 예외 처리

2.1 주요 내장 예외(Built-in Exceptions)

파이썬에서 자주 발생하는 대표적인 내장 예외는 다음과 같습니다.

  • ZeroDivisionError: 0으로 나누려고 할 때 발생
  • ValueError: 함수나 연산이 예상하지 못한 값을 받았을 때 발생
  • TypeError: 잘못된 데이터 타입을 사용했을 때 발생
  • IndexError: 리스트, 튜플 등의 인덱스 범위를 초과했을 때 발생
  • KeyError: 딕셔너리에 존재하지 않는 키를 참조할 때 발생
  • FileNotFoundError: 존재하지 않는 파일을 열려고 할 때 발생

2.2 기본적인 예외 처리 문법

파이썬에서 예외 처리는 try, except, else, finally 블록을 활용하여 구현할 수 있습니다.

try:
    # 예외가 발생할 가능성이 있는 코드
except ExceptionType:
    # 해당 유형의 예외가 발생했을 때 실행할 코드
else:
    # 예외가 발생하지 않았을 경우 실행할 코드
finally:
    # 예외 발생 여부와 관계없이 항상 실행되는 코드

2.3 예제: ZeroDivisionError 처리

def divide(a, b):
    try:
        result = a / b
    except ZeroDivisionError:
        return "오류: 0으로 나눌 수 없습니다."
    return result

print(divide(10, 2))  # 출력: 5.0
print(divide(10, 0))  # 출력: "오류: 0으로 나눌 수 없습니다."

3. 사용자 정의 예외(Custom Exceptions)

3.1 사용자 정의 예외가 필요한 이유

내장 예외만으로는 해결할 수 없는 특정한 상황이 있습니다. 예를 들어, 은행 애플리케이션에서 계좌 잔액이 부족할 때 발생하는 오류ValueError 같은 일반적인 예외보다는 InsufficientFundsError 같은 사용자 정의 예외가 더 적절합니다.

사용자 정의 예외를 사용하면 프로그램의 가독성을 높이고, 오류의 원인을 보다 명확하게 전달할 수 있습니다.

3.2 사용자 정의 예외 생성 방법

사용자 정의 예외는 Exception 클래스를 상속하여 새로운 예외 클래스를 만들면 됩니다.

class NegativeNumberError(Exception):
    """음수를 입력하면 발생하는 사용자 정의 예외"""
    pass

def sqrt(num):
    if num < 0:
        raise NegativeNumberError("오류: 음수의 제곱근은 계산할 수 없습니다.")
    return num ** 0.5

try:
    print(sqrt(-9))
except NegativeNumberError as e:
    print(e)

이 예제에서 NegativeNumberError는 음수를 제곱근 연산에 사용할 수 없다는 의미를 전달하는 사용자 정의 예외입니다.


4. 실용적인 예외 처리 예제

4.1 여러 개의 예외 처리하기

하나의 except 블록에서 여러 개의 예외를 처리할 수도 있습니다.

def convert_to_int(value):
    try:
        return int(value)
    except (TypeError, ValueError):
        return "오류: 올바른 숫자 값을 입력하세요."

print(convert_to_int("123"))  # 123
print(convert_to_int("abc"))  # 오류 메시지 출력
print(convert_to_int(None))   # 오류 메시지 출력

4.2 raise를 활용한 예외 발생

개발자는 raise 키워드를 사용하여 특정 상황에서 예외를 강제로 발생시킬 수 있습니다.

def check_age(age):
    if age < 18:
        raise ValueError("오류: 18세 이상만 등록 가능합니다.")
    return "등록이 완료되었습니다."

try:
    print(check_age(16))
except ValueError as e:
    print(e)

5. 결론: 예외 처리를 통해 코드의 신뢰성 향상

예외 처리는 프로그램이 예상치 못한 상황에서도 정상적으로 실행될 수 있도록 돕는 중요한 기능입니다. 내장 예외와 사용자 정의 예외를 적절히 활용하면 프로그램의 안정성과 신뢰성을 높일 수 있습니다.

✅ 예외 처리를 잘 활용하면:

  • 프로그램이 더욱 견고해집니다.
  • 사용자 경험이 향상됩니다.
  • 오류 발생 시 빠른 디버깅이 가능합니다.

앞으로의 개발에서 예외 처리를 적극적으로 활용하여 더욱 안정적인 코드를 작성해 보세요! 🚀

728x90