파이썬 예외처리 방법(try,catch,finally)

예외처리란 코드에서 예기치 못한 에러를 처리해야 할 때 사용하는 방법 입니다.

대부분 언어들이 try,catch,finally를 사용하며 파이썬도 마찬가지입니다



1. 예외 처리가 왜 필요할까?

프로그램을 실행하다 보면 예상치 못한 오류가 발생합니다. 예외 처리를 하지 않으면 프로그램이 갑자기 종료됩니다.

# 예외 처리 없이 실행
number = int(input("숫자를 입력하세요: "))
result = 10 / number #ZeroDivisionError 0으로 나누기는 안됨
print(f"결과: {result}")

문제점:

  • 사용자가 "abc" 입력 → 프로그램 강제 종료
  • 사용자가 0 입력 → 프로그램 강제 종료(코드에 설명)

2. try-except 기본 문법

기본 구조

try:
    # 오류가 발생할 수 있는 코드
    실행할_코드
except:
    # 오류 발생 시 실행
    오류_처리_코드

실행 흐름

try:
    print("1번 실행")
    number = int(input("숫자 입력: "))
    print("2번 실행")
    result = 10 / number
    print("3번 실행")
except:
    print("오류 발생!")

케이스 1: 정상 입력 (5)

1번 실행
(입력: 5)
2번 실행
3번 실행
→ except는 실행 안 됨

케이스 2: 문자 입력 (abc)

1번 실행
(입력: abc)
→ 오류 발생! except로 이동
오류 발생!
→ 2번, 3번은 실행 안 됨

케이스 3: 0 입력

1번 실행
(입력: 0)
2번 실행
→ 오류 발생! except로 이동
오류 발생!
→ 3번은 실행 안 됨

핵심: try에서 오류가 발생하면 즉시 except로 이동하고, try의 나머지 코드는 실행되지 않습니다.

3. 특정 예외만 처리하기

try:
    number = int(input("숫자를 입력하세요: "))
    result = 10 / number
    print(f"결과: {result}")
except ValueError:
    print("숫자를 입력해야 합니다!")
except ZeroDivisionError:
    print("0으로 나눌 수 없습니다!")

실행 예시:

# abc 입력 시
숫자를 입력하세요: abc
숫자를 입력해야 합니다!

# 0 입력 시
숫자를 입력하세요: 0
0으로 나눌 수 없습니다!

예외 정보 확인하기

try:
    number = int(input("숫자를 입력하세요: "))
    result = 10 / number
except ValueError as e:
    print(f"오류 내용: {e}")
except ZeroDivisionError as e:
    print(f"오류 내용: {e}")

as e를 사용하면 오류의 구체적인 정보를 볼 수 있습니다.

4. finally - 항상 실행되는 코드

try:
    number = int(input("숫자를 입력하세요: "))
    result = 10 / number
    print(f"결과: {result}")
except:
    print("오류가 발생했습니다!")
finally:
    print("프로그램을 종료합니다.")

실행 흐름:

케이스 1: 정상 실행 (5 입력)

숫자를 입력하세요: 5
결과: 2.0
프로그램을 종료합니다.

케이스 2: 오류 발생 (0 입력)

숫자를 입력하세요: 0
오류가 발생했습니다!
프로그램을 종료합니다.

핵심: finally는 오류가 발생하든 안 하든 무조건 실행됩니다.

finally의 용도

finally는 주로 정리 작업에 사용합니다.

file = None
try:
    file = open("data.txt", "r")
    content = file.read()
    print(content)
except FileNotFoundError:
    print("파일을 찾을 수 없습니다.")
finally:
    if file:
        file.close()  # 오류 여부와 관계없이 파일을 닫음
    print("작업 완료")

파일을 열었으면 반드시 닫아야 하는데, finally를 사용하면 오류가 발생해도 파일을 안전하게 닫을 수 있습니다.

5. 자주 만나는 예외 종류

# ValueError: 잘못된 값
int("abc")

# ZeroDivisionError: 0으로 나누기
10 / 0

# IndexError: 존재하지 않는 인덱스
my_list = [1, 2, 3]
print(my_list[10])

# KeyError: 존재하지 않는 키
my_dict = {"name": "홍길동"}
print(my_dict["age"])

# FileNotFoundError: 존재하지 않는 파일
open("없는파일.txt", "r")

6. 정리

완전한 구조

try:
    # 오류가 발생할 수 있는 코드 (항상 실행)
    number = int(input("숫자 입력: "))
    result = 10 / number
    print(f"결과: {result}")
except ValueError:
    # ValueError 발생 시 실행
    print("숫자를 입력해야 합니다!")
except ZeroDivisionError:
    # ZeroDivisionError 발생 시 실행
    print("0으로 나눌 수 없습니다!")
finally:
    # 항상 실행 (오류 여부와 무관)
    print("종료")

실행 순서

  1. try 블록이 먼저 실행됩니다
  2. 오류가 발생하면 해당하는 except 블록으로 이동합니다
  3. finally 블록은 무조건 마지막에 실행됩니다

핵심 포인트

  • try: 오류가 발생할 수 있는 코드를 작성
  • except: 오류 발생 시 처리할 코드를 작성
  • finally: 오류 여부와 관계없이 항상 실행되는 코드 (파일 닫기, 정리 작업)
  • 오류가 발생하면 try의 나머지 코드는 건너뛰고 except로 이동
  • 구체적인 예외를 처리하는 것이 좋습니다 (ValueError, ZeroDivisionError 등)

댓글 쓰기