너도 할 수 있는, 너도밤나무 코딩

[Python] 예외 처리(Exception Handling) 심화 가이드 본문

프로그래밍 언어/파이썬

[Python] 예외 처리(Exception Handling) 심화 가이드

곡마일장 2025. 9. 10. 10:16
반응형

파이썬에서 예외 처리는 프로그램이 오류를 만나더라도 정상적으로 동작을 이어가게 하는 중요한 기능입니다.
이번 글에서는 예외 처리 기본 구조, 여러 예외 처리, 사용자 정의 예외, 실전 계산기 예제, 예외 처리 팁과 베스트 프랙티스까지 자세히 다룹니다.


1. 예외 처리 기본 구조

파이썬의 예외 처리 구조는 try, except, else, finally 네 가지 블록으로 이루어져 있습니다.

try:
    number = int(input("숫자를 입력하세요: "))
    result = 10 / number
except ValueError:
    print("유효한 숫자를 입력해야 합니다.")
except ZeroDivisionError:
    print("0으로 나눌 수 없습니다.")
else:
    print(f"결과: {result}")
finally:
    print("프로그램 종료")
  • try: 예외가 발생할 수 있는 코드 블록
  • except: 특정 예외를 처리
  • else: 예외가 없을 때 실행
  • finally: 예외 발생 여부와 상관없이 항상 실행

2. 여러 예외 처리

하나의 except에서 여러 예외를 처리할 수 있으며, 예외 객체를 활용해 오류 정보 출력 가능

try:
    data = [1, 2, 3]
    index = int(input("인덱스를 입력하세요: "))
    print(data[index])
except (ValueError, IndexError) as e:
    print(f"오류 발생: {e}")

3. 예외 객체 활용

예외 객체를 사용하면 오류 메시지 확인, 로깅, 디버깅에 유용합니다.

try:
    x = int("abc")
except ValueError as e:
    print("예외 메시지:", e)

4. 사용자 정의 예외

직접 예외 클래스를 정의하여 코드 가독성과 유지보수성을 높일 수 있습니다.

class NegativeNumberError(Exception):
    def __init__(self, value):
        self.value = value
        super().__init__(f"음수는 허용되지 않습니다: {value}")

def check_positive(number):
    if number < 0:
        raise NegativeNumberError(number)
    return True

try:
    check_positive(-5)
except NegativeNumberError as e:
    print(e)

5. 실전 예제: 안전한 계산기

def safe_divide(a, b):
    try:
        return a / b
    except ZeroDivisionError:
        print("0으로 나눌 수 없습니다.")
        return None

def calculator():
    try:
        x = int(input("첫 번째 숫자: "))
        y = int(input("두 번째 숫자: "))
        op = input("연산자(+,-,*,/): ")
        
        if op == '+':
            result = x + y
        elif op == '-':
            result = x - y
        elif op == '*':
            result = x * y
        elif op == '/':
            result = safe_divide(x, y)
        else:
            raise ValueError("지원하지 않는 연산자입니다.")
    except ValueError as e:
        print("입력 오류:", e)
    else:
        if result is not None:
            print(f"결과: {result}")
    finally:
        print("계산기 종료")

calculator()
  • 0으로 나누기, 잘못된 입력, 지원하지 않는 연산자 모두 처리 가능
  • finally 블록으로 종료 메시지 항상 출력

6. 팁과 베스트 프랙티스

  1. 구체적인 예외 처리: except Exception:보다 구체적 예외 처리 권장
  2. 예외 메시지 활용: 디버깅과 로깅에 유용
  3. 사용자 정의 예외: 코드 가독성과 유지보수 향상
  4. finally 활용: 파일 닫기, 리소스 해제 등 필수 처리
  5. with 문과 예외 처리 결합: 리소스 관리와 안전한 예외 처리
  6. 계층적 예외 처리: 상위 예외보다 하위 예외를 먼저 처리
반응형