예외처리란 코드에서 예기치 못한 에러를 처리해야 할 때 사용하는 방법 입니다.
대부분 언어들이 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("종료")
실행 순서
- try 블록이 먼저 실행됩니다
- 오류가 발생하면 해당하는 except 블록으로 이동합니다
- finally 블록은 무조건 마지막에 실행됩니다
핵심 포인트
- try: 오류가 발생할 수 있는 코드를 작성
- except: 오류 발생 시 처리할 코드를 작성
- finally: 오류 여부와 관계없이 항상 실행되는 코드 (파일 닫기, 정리 작업)
- 오류가 발생하면 try의 나머지 코드는 건너뛰고 except로 이동
- 구체적인 예외를 처리하는 것이 좋습니다 (ValueError, ZeroDivisionError 등)
댓글 쓰기