Python 07 - Exception Handling

KjjeddΒ·2025λ…„ 12μ›” 29일

Python

λͺ©λ‘ 보기
7/10
post-thumbnail

πŸ’¬ μ˜ˆμ™Έ 처리(Exception Handling)λž€?

μ˜ˆμ™Έ(Exception): ν”„λ‘œκ·Έλž¨ μ‹€ν–‰ 쀑 λ°œμƒν•˜λŠ” μ˜ˆμƒμΉ˜ λͺ»ν•œ 상황
처리(Handling): κ·Έ 상황을 κ°μ§€ν•˜κ³  μ•ˆμ „ν•˜κ²Œ λŒ€μ‘ν•˜λŠ” 것

ν”„λ‘œκ·Έλž¨μ€ 항상 μš°λ¦¬κ°€ μ˜λ„ν•œ μž…λ ₯만 λ°›μ§€ μ•ŠλŠ”λ‹€. 숫자λ₯Ό κΈ°λŒ€ν–ˆλŠ”λ° λ¬Έμžκ°€ λ“€μ–΄μ˜€κ±°λ‚˜, 파일이 μ‘΄μž¬ν•˜μ§€ μ•Šκ±°λ‚˜, 0으둜 λ‚˜λˆ„λŠ” 상황이 μ–Έμ œλ“  λ°œμƒν•  수 μžˆλ‹€.

이런 μƒν™©μ—μ„œ ν”„λ‘œκ·Έλž¨μ΄ λ°”λ‘œ μ’…λ£Œλœλ‹€λ©΄ μ‚¬μš©μžλŠ” λ‹Ήν™©ν•˜κ³ , μ„œλΉ„μŠ€λŠ” λΆˆμ•ˆμ •ν•΄μ§„λ‹€. μ˜ˆμ™Έ μ²˜λ¦¬λŠ” ν”„λ‘œκ·Έλž¨μ˜ μ•ˆμ •μ„±μ„ μ±…μž„μ§€λŠ” μ•ˆμ „λ§μ΄λ‹€.


try:
    result = 10 / 0
except ZeroDivisionError:
    print("μ—λŸ¬: 0으둜 λ‚˜λˆŒ 수 μ—†μŠ΅λ‹ˆλ‹€")

μœ„ μ½”λ“œμ²˜λŸΌ μ˜ˆμ™Έλ₯Ό μ²˜λ¦¬ν•˜λ©΄, ν”„λ‘œκ·Έλž¨μ€ μ£½μ§€ μ•Šκ³  λ‹€μŒ λ‘œμ§μ„ 계속 μˆ˜ν–‰ν•  수 μžˆλ‹€.


🎯 μ™œ μ˜ˆμ™Έ 처리λ₯Ό λ°°μ›Œμ•Ό ν• κΉŒ?

  • ν”„λ‘œκ·Έλž¨ 비정상 μ’…λ£Œ λ°©μ§€
  • μ‚¬μš©μžμ—κ²Œ μΉœμ ˆν•œ μ—λŸ¬ λ©”μ‹œμ§€ 제곡
  • 싀무 μ„œλΉ„μŠ€μ˜ μ•ˆμ •μ„± 확보
  • μ—λŸ¬ 원인 νŒŒμ•… 및 디버깅 용이

μ‹€λ¬΄μ—μ„œ μ˜ˆμ™Έ μ²˜λ¦¬κ°€ μ—†λŠ” μ½”λ“œ = μœ„ν—˜ν•œ μ½”λ“œλ‹€.


πŸ›‘οΈ μ˜ˆμ™Έ 처리 ꡬ쑰 ν•œλˆˆμ— 보기


try:
    # λ¬Έμ œκ°€ λ°œμƒν•  수 μžˆλŠ” μ½”λ“œ
except νŠΉμ •μ˜ˆμ™Έ as e:
    # ν•΄λ‹Ή μ˜ˆμ™Έ 처리
except Exception as e:
    # λͺ¨λ“  μ˜ˆμ™Έ 처리
else:
    # μ˜ˆμ™Έκ°€ λ°œμƒν•˜μ§€ μ•Šμ•˜μ„ λ•Œλ§Œ μ‹€ν–‰
finally:
    # μ˜ˆμ™Έ 여뢀와 상관없이 항상 μ‹€ν–‰
  • try: μœ„ν—˜ ꡬ간
  • except: μ˜ˆμ™Έ λ°œμƒ μ‹œ λŒ€μ‘
  • else: 성곡 μ‹œ μ‹€ν–‰
  • finally: 무쑰건 μ‹€ν–‰ (정리 μž‘μ—…)

❗ μ—λŸ¬(Error) vs μ˜ˆμ™Έ(Exception)

ꡬ뢄 μ„€λͺ…
Error 문법 였λ₯˜ λ“± ν”„λ‘œκ·Έλž¨ μ‹€ν–‰ μžμ²΄κ°€ λΆˆκ°€λŠ₯ν•œ μƒνƒœ
Exception μ‹€ν–‰ 쀑 λ°œμƒν•˜μ§€λ§Œ 처리 κ°€λŠ₯

# Error (μ‹€ν–‰ λΆˆκ°€)
if True
    print("error")

# Exception (처리 κ°€λŠ₯)
10 / 0

πŸ“Œ 자주 λ“±μž₯ν•˜λŠ” μ˜ˆμ™Έ νƒ€μž…

μ˜ˆμ™Έ λ°œμƒ 상황
ValueError 잘λͺ»λœ κ°’
TypeError νƒ€μž… 뢈일치
ZeroDivisionError 0으둜 λ‚˜λˆ„κΈ°
FileNotFoundError 파일 μ—†μŒ
IndexError 인덱슀 초과
KeyError λ”•μ…”λ„ˆλ¦¬ ν‚€ μ—†μŒ

🚨 μ˜ˆμ™Έ 직접 λ°œμƒμ‹œν‚€κΈ° (raise)

λ…Όλ¦¬μ μœΌλ‘œ 잘λͺ»λœ μƒν™©μ΄μ§€λ§Œ, 파이썬이 μžλ™μœΌλ‘œ μ—λŸ¬λ₯Ό λ‚΄μ£Όμ§€ μ•ŠλŠ” κ²½μš°λ„ μžˆλ‹€. 이럴 λ•Œ raiseλ₯Ό μ‚¬μš©ν•œλ‹€.


def divide(a, b):
    if b == 0:
        raise ValueError("bλŠ” 0이 될 수 μ—†μŒ")
    return a / b

🧩 μ‚¬μš©μž μ •μ˜ μ˜ˆμ™Έ

μ‹€λ¬΄μ—μ„œλŠ” 의미 μžˆλŠ” μ—λŸ¬λ₯Ό λ§Œλ“€κΈ° μœ„ν•΄ 직접 μ˜ˆμ™Έ 클래슀λ₯Ό μ •μ˜ν•œλ‹€.


class InsufficientBalanceError(Exception):
    pass

class BankAccount:
    def __init__(self, balance):
        self.balance = balance

    def withdraw(self, amount):
        if amount > self.balance:
            raise InsufficientBalanceError("μž”μ•‘ λΆ€μ‘±")
        self.balance -= amount

μ΄λ ‡κ²Œ ν•˜λ©΄ μ—λŸ¬ λ©”μ‹œμ§€ μžμ²΄κ°€ λ¬Έμ„œ 역할을 ν•˜κ²Œ λœλ‹€.


πŸ“‚ 파일 μž…μΆœλ ₯κ³Ό μ˜ˆμ™Έ 처리

νŒŒμΌμ€ μ–Έμ œλ“  없을 수 있고, μ—΄λ‹€κ°€ μ‹€νŒ¨ν•  수 μžˆλ‹€.


try:
    f = open("data.txt", "r")
    data = f.read()
except FileNotFoundError:
    print("파일이 μ—†μŠ΅λ‹ˆλ‹€")
finally:
    f.close()

⭐ with ꡬ문 (Context Manager)

withλŠ” νŒŒμΌμ„ μ•ˆμ „ν•˜κ²Œ κ΄€λ¦¬ν•˜κΈ° μœ„ν•œ ν•„μˆ˜ 문법이닀.


with open("data.txt", "r", encoding="utf-8") as f:
    data = f.read()
  • μžλ™ close()
  • μ˜ˆμ™Έ λ°œμƒ μ‹œμ—λ„ μ•ˆμ „
  • μ½”λ“œ κ°„κ²°

πŸ“„ 파일 λͺ¨λ“œ 정리

λͺ¨λ“œ 의미
r읽기
wμ“°κΈ° (κΈ°μ‘΄ μ‚­μ œ)
aμΆ”κ°€
rb / wbλ°”μ΄λ„ˆλ¦¬

πŸ“Š CSV 파일 처리


import csv

with open("students.csv", "r", encoding="utf-8") as f:
    reader = csv.reader(f)
    for row in reader:
        print(row)

🧬 JSON 파일 처리


import json

data = {"name": "Kim", "age": 20}

with open("config.json", "w", encoding="utf-8") as f:
    json.dump(data, f, ensure_ascii=False, indent=2)

πŸ”₯ 핡심 μš”μ•½

  • μ˜ˆμ™Έ μ²˜λ¦¬λŠ” 선택이 μ•„λ‹ˆλΌ ν•„μˆ˜
  • try-exceptλŠ” μ„œλΉ„μŠ€ μ•ˆμ •μ„±μ˜ 핡심
  • raise둜 μ˜λ„λ₯Ό λͺ…ν™•νžˆ ν‘œν˜„
  • withλŠ” 파일 처리의 κΈ°λ³Έ
  • CSV, JSON은 싀무 데이터 처리의 κΈ°λ³Έ λ‹¨μœ„

profile
Gongbuhaja

0개의 λŒ“κΈ€