Python 예외 처리 마스터하기: try, except, else, finally 완전 정복
Python 예외 처리 마스터하기: try, except, else, finally 완전 정복
이 가이드는 Python의 예외 처리 구문을 실용적 코드 스니펫과 모범 사례 팁으로 안내합니다.
동영상: Python 예외 처리 (try..except..finally)
Python의 예외
Python은 런타임 에러 발생 시 내장 예외를 발생시킵니다. 인터프리터는 현재 코드 블록을 중단하고 예외를 호출 스택 위로 전파해 핸들러를 찾습니다. 핸들러가 없으면 프로그램이 종료되며 트레이스백 출력.
다음 호출 체인 고려: A가 B 호출, B가 C 호출. C가 로컬에서 처리되지 않는 예외 발생 시 B로, 다시 A로 전파. 처리되지 않은 예외는 급작스러운 프로그램 종료 초래.
Python에서 예외 잡기
예외를 가로채려면 잠재적 위험 코드를 try 블록에 배치. except 절에 예외 발생 시 실행할 로직 작성.
흐름을 보여주는 간결한 예제:
# 예외 타입 확인용 sys 모듈 임포트
import sys
random_list = ['a', 0, 2]
for entry in random_list:
try:
print("The entry is", entry)
r = 1 / int(entry)
break
except:
print("Oops!", sys.exc_info()[0], "occurred.")
print("Next entry.")
print()
print("The reciprocal of", entry, "is", r)
출력
The entry is a Oops! <class 'ValueError'> occurred. Next entry. The entry is 0 Oops! <class 'ZeroDivisionError'> occurred. Next entry. The entry is 2 The reciprocal of 2 is 0.5
코드는 random_list를 순회. int 변환이나 나눗셈 실패 시 except 블록이 에러 처리, 로그 출력, 다음 항목으로 이동. 성공 시 루프 종료 후 역수 출력.
모든 내장 예외는 Exception을 상속하므로 제네릭하게 잡을 수 있습니다:
# 예외 타입 확인용 sys 모듈 임포트
import sys
random_list = ['a', 0, 2]
for entry in random_list:
try:
print("The entry is", entry)
r = 1 / int(entry)
break
except Exception as e:
print("Oops!", e.__class__, "occurred.")
print("Next entry.")
print()
print("The reciprocal of", entry, "is", r)
출력은 동일하지만 핸들러가 e.__class__로 특정 예외 클래스 참조.
특정 예외 잡기
모든 예외를 광범위하게 잡으면 버그를 숨기고 디버깅 어렵게 만듭니다. 대신 예상되는 예외 타입만 나열하세요.
try 블록에 여러 except 절 포함 가능; 첫 번째 매칭 절만 실행. 예:
try:
# 에러 발생 가능 코드
pass
except ValueError:
# ValueError 처리
pass
except (TypeError, ZeroDivisionError):
# TypeError 또는 ZeroDivisionError 처리
pass
except Exception:
# 기타 예외 폴백
pass
Python에서 예외 발생시키기
자동 예외 외에 개발자가 raise 문으로 명시적 에러 발생 가능. 선택적으로 메시지 전달해 이유 명확히.
raise KeyboardInterrupt # Traceback: KeyboardInterrupt
raise MemoryError("This is an argument") # Traceback: MemoryError: This is an argument
try:
a = int(input("Enter a positive integer: "))
if a <= 0:
raise ValueError("That is not a positive number!")
except ValueError as ve:
print(ve)
Python try-else 절
선택적 else 절은 try 블록이 예외 없이 완료될 때만 실행. 성공 경로 코드를 에러 처리와 분리하는 패턴.
예: 짝수의 역수 출력.
# 짝수의 역수 출력 프로그램
try:
num = int(input("Enter a number: "))
assert num % 2 == 0
except:
print("Not an even number!")
else:
reciprocal = 1 / num
print(reciprocal)
홀수 입력 시 출력:
Enter a number: 1 Not an even number!
짝수 입력 시 출력:
Enter a number: 4 0.25
num이 0이면 ZeroDivisionError가 else 블록에서 발생하며 앞선 except 절에서 잡히지 않음에 유의.
Python try…finally
finally 절은 예외 발생 여부와 상관없이 정리 코드 실행을 보장. 파일, 네트워크 연결, GUI 같은 외부 자원 다룰 때 필수.
파일 처리 전형적 사용:
try:
f = open("test.txt", encoding='utf-8')
# 파일 연산 수행
finally:
f.close()
처리 중 에러 발생해도 파일은 항상 닫힘.