4. 예외 처리

header

1. 예외란?

프로그램 실행 도중 발생하는 예상치 못한 상황을 말합니다.

  • 에러(Error): 시스템 레벨 문제 (메모리 부족, 심각한 버그 등)
  • 예외(Exception): 사용자의 잘못된 입력, 파일 없음 등 코드 실행 중 처리 가능한 문제
# ZeroDivisionError 예시
print(7 / 0)

실행하면 ZeroDivisionError가 발생합니다.

2. 대표적인 예외 클래스

  • BaseException: 최상위 예외 클래스
  • Exception: 대부분 예외의 부모
  • ArithmeticError, AttributeError, EOFError, FileNotFoundError, IndexError, NameError, SyntaxError, TypeError, ValueError 등
num1 = int(input("첫 번째 정수를 입력하세요: "))
num2 = int(input("두 번째 정수를 입력하세요: "))
print("결과:", num1 / num2)

문자 입력 시 ValueError, 0 입력 시 ZeroDivisionError 발생.

3. 예외 처리 문법

try-except

try:
    num = int(input("정수를 입력하세요: "))
    print(10 / num)
except ArithmeticError:
    print("산술 연산 오류!")
except ValueError:
    print("잘못된 입력값입니다.")

try-except [as 변수]

try:
    lst = [1,2,3]
    print(lst[5])
except IndexError as e:
    print("예외 메시지:", e)

try-finally

try:
    f = open("test.txt", "w")
    f.write("Hello")
except IOError as e:
    print("파일 오류:", e)
finally:
    f.close()
    print("파일 닫기 완료:", f.closed)

try-except-else

try:
    num = int(input("숫자 입력: "))
except ValueError:
    print("숫자가 아닙니다.")
else:
    print("정상 입력:", num)

연습 문제 1 - 숫자 입력 검증

사용자에게 숫자를 입력받아 100을 나눈 결과를 출력하세요.
만약 숫자가 아닌 값을 입력하면 ValueError를 처리하여 “숫자만 입력 가능합니다.”라는 메시지를 출력하세요.
0을 입력하면 ZeroDivisionError를 처리하여 “0으로는 나눌 수 없습니다.”라는 메시지를 출력하세요.

정답 보기

    try:
      num = int(input("숫자 입력: "))
      print("100 /", num, "=", 100 / num)
    except ValueError:
      print("숫자만 입력 가능합니다.")
    except ZeroDivisionError:
      print("0으로는 나눌 수 없습니다.")
  

4. 커스텀 예외

raise (강제로 예외 발생)

age = int(input("나이를 입력하세요: "))
if age < 0 or age > 150:
    raise Exception("나이는 0 이상 150 이하로 입력해야 합니다.")

사용자 정의 예외 클래스

class AgeError(Exception):
    def __init__(self):
        super().__init__("사람의 나이는 0이상 200 미만으로 입력해 주세요.")

try:
    age = int(input("나이: "))
    if age < 0 or age >= 200:
        raise AgeError()
    print("입력한 나이:", age)
except AgeError as e:
    print("예외 발생:", e)

5. 단계별 실습 문제

문제 1 - 은행 입금 (기초)

사용자에게 입금 금액을 입력받아 출력하세요.
단, 음수이면 Exception 예외를 발생시키고 메시지를 출력하세요.

정답 보기

    amount = int(input("입금 금액: "))
    if amount < 0:
        raise Exception("음수 금액은 허용되지 않습니다.")
    print("입금 완료:", amount, "원")
  

문제 2 - SNS 글쓰기 (기초)

글을 입력받아 출력하세요.
글자 수가 100자를 초과하면 Exception 예외를 발생시키세요.

정답 보기

    post = input("글 입력: ")
    if len(post) > 100:
        raise Exception("100자를 초과했습니다.")
    print("게시 성공:", post)
  

문제 3 - 쇼핑몰 주문 (중급)

재고 5개가 있는 상품을 주문받으세요.
주문 수량이 재고를 초과하면 Exception 예외 처리하세요.

정답 보기

    stock = 5
    try:
        qty = int(input("주문 수량: "))
        if qty > stock:
            raise Exception("재고 부족: 남은 수량은 " + str(stock))
        print("주문 완료:", qty, "개")
    except Exception as e:
        print("주문 실패:", e)
  

문제 4 - 로그인 검증 (중급)

아이디와 비밀번호를 입력받아 검증하세요.
아이디 또는 비밀번호가 틀리면 Exception 예외를 발생시키세요.

정답 보기

    USER = "admin"
    PWD = "1234"  
    try:
        uid = input("아이디: ")
        pw = input("비밀번호: ")
        if uid != USER or pw != PWD:
            raise Exception("로그인 실패")
        print("로그인 성공!")
    except Exception as e:
        print(e)
  

문제 5 - 사용자 정의 예외 (심화)

음수를 입력하면 NegativeNumberError라는 사용자 정의 예외를 발생시키세요.

정답 보기

    class NegativeNumberError(Exception):
        def __init__(self):
            super().__init__("음수는 허용되지 않습니다.")  
    try:
        num = int(input("숫자 입력: "))
        if num < 0:
            raise NegativeNumberError()
        print("입력된 숫자:", num)
    except NegativeNumberError as e:
        print("예외 발생:", e)