SP'S SPARKING

[Python 기초] 예외 처리: 에러 앞에서도 멈추지 않는 프로그램 본문

HAPPYHACKING

[Python 기초] 예외 처리: 에러 앞에서도 멈추지 않는 프로그램

SPSP 2026. 3. 16. 14:11

이번 시간에는 프로그램의 완성도를 결정짓는 '예외 처리(Exception Handling)'에 대해 알아보자. 코드를 아무리 잘 짜더라도 사용자의 실수나 예상치 못한 상황으로 인해 에러는 발생하기 마련이다.

이전에 배웠던 조건문(if-else)이 논리적인 흐름을 제어했다면, 예외 처리는 프로그램이 갑작스럽게 멈추는 '비정상 종료'를 막고 안전하게 끝까지 실행되도록 돕는 안전장치와 같다.


1. 예외 처리의 정의와 기본 구조

프로그램 실행 중 발생하는 에러를 '예외(Exception)'라고 한다. 예외 처리는 이 에러를 미리 예상하여 별도의 길로 안내하는 과정이다. 파이썬에서는 try-except 문을 사용하며, 예외가 발생할 가능성이 있는 코드를 감싸 보호한다.

try:
    # 예외가 발생할 수 있는 코드
except 예외타입:
    # 예외가 발생했을 때 실행할 코드

예제: 0으로 나누기 예외 처리

try:
    result = 10 / 0
except ZeroDivisionError:
    print("0으로 나눌 수 없습니다.")

코드 해석: 파이썬에서 숫자를 0으로 나누면 ZeroDivisionError가 발생한다. try 블록 안에서 에러가 발생하면 즉시 중단되고 except 블록으로 넘어가 준비된 메시지를 출력한다. 덕분에 프로그램은 강제 종료되지 않고 안전하게 유지된다. 핵심 키워드: ZeroDivisionError, try-except


2. 다양한 예외 타입 처리

사용자로부터 입력을 받을 때는 특히 예외 처리가 중요하다. 숫자를 입력해야 하는 곳에 문자를 넣는 등의 실수를 처리할 수 있다.

try:
    user_input = input("숫자를 입력하세요: ")
    number = int(user_input)
    print(f"입력한 숫자는 {number}입니다.")
except ValueError:
    print("유효한 숫자를 입력하세요.")

 

코드 해석: int() 함수는 문자열을 정수로 변환한다. 만약 사용자가 '안녕'과 같은 문자를 입력하면 ValueError가 발생한다. except ValueError 블록이 이를 가로채서 사용자에게 친절한 안내 문구를 보여준다. 핵심 키워드: ValueError, 형 변환(Casting)

 


3. else와 finally: 완벽한 마무리

예외 처리에는 에러가 발생하지 않았을 때만 실행되는 else, 그리고 에러 발생 여부와 상관없이 무조건 실행되는 finally 블록을 추가할 수 있다.

try:
    number = int(input("숫자를 입력하세요: "))
except ValueError:
    print("유효한 숫자를 입력하세요.")
else:
    print(f"입력한 숫자는 {number}입니다.")
finally:
    print("프로그램이 종료됩니다.")

코드 해석: > 1. try: 숫자 변환 시도 2. except: 에러 발생 시 안내 출력 3. else: 에러가 없을 때만 입력값 확인 메시지 출력 4. finally: 에러 여부와 무관하게 마지막 인사를 출력하며 마무리 핵심 키워드: else, finally


4. 모든 예외 처리와 Exception 클래스

발생할 에러의 종류를 정확히 모를 때는 모든 예외의 조상 격인 Exception 클래스를 사용한다. as e를 붙이면 구체적인 에러 메시지도 확인할 수 있다.

try:
    # 예측하기 힘든 예외 상황 코드
    result = 10 / "a" 
except Exception as e:
    print(f"예외가 발생했습니다: {e}")

코드 해석: 문자열로 나눗셈을 시도하면 TypeError가 발생한다. 특정하지 않은 에러라도 Exception이 모두 받아내어 어떤 에러인지 알려준다. 다만, 공부할 때는 가급적 에러 타입을 정확히 지정하는 습관을 들이는 것이 좋다. 핵심 키워드: Exception 클래스, 예외 객체(e)


실전 종합 예제: 1인당 금액 계산기

여러 개의 except 블록을 사용하여 다양한 상황(문자 입력, 0 입력 등)을 한꺼번에 관리하는 실전 코드이다.

try :
    a = int(input("인원 입력: "))
    b = int(input("금액 입력: "))
    c = b / a
except ValueError:
    print("숫자를 입력하세요.")
except ZeroDivisionError:
    print("인원은 0보다 커야 합니다.")
except Exception as e:
    print(f"예상치 못한 예외 발생: {e}")
else:
    print(f"1인당 금액: {c}")
finally:
    print("이용해 주셔서 감사합니다.")

[실행 결과 예시]

  • 정상 입력 (3명, 15000원): "1인당 금액: 5000.0" 출력 후 "이용해 주셔서 감사합니다."
  • 잘못된 입력 (여섯 명 입력): "숫자를 입력하세요." 출력 후 "이용해 주셔서 감사합니다."
  • 0 입력 (0명 입력): "인원은 0보다 커야 합니다." 출력 후 "이용해 주셔서 감사합니다."

코드 해석: 앞서 배운 연산자와 입출력, 예외 처리가 모두 집약된 구조이다. 각기 다른 에러에 대응하는 except 문들이 프로그램의 방어막 역할을 한다.

 

5. raise: 예외를 강제로 발생시키기

방어적으로 에러를 막는 것을 넘어, 프로그래머가 특정 조건에서 의도적으로 에러를 일으켜야 할 때가 있다. 이때 raise 명령어를 사용한다.

def set_age(age):
    if age < 0:
        raise ValueError("나이는 0 이상이어야 합니다.")
    print(f"나이는 {age}입니다.")

try:
    set_age(-3)
except ValueError as e:
    print(f"예외가 발생했습니다: {e}")

코드 해석: set_age 함수는 나이가 음수일 때 raise를 통해 ValueError를 강제로 발생시킨다. 호출하는 쪽에서는 이를 try-except로 받아내어 "나이는 0 이상이어야 합니다."라는 사용자 정의 메시지를 출력할 수 있다. 이는 잘못된 데이터가 프로그램 깊숙이 전달되는 것을 입구에서 차단하는 역할을 한다.


마치며

예외 처리는 사용자와 프로그램 사이의 '친절한 대화'와 같다. 에러가 났을 때 검은 화면에 깨진 글자가 나오는 대신, 우리가 준비한 안내 문구를 보여줌으로써 프로그램의 신뢰도를 높일 수 있다.

728x90