
Python Error 알아보기
# Chapter07-1
# 파이썬 예외처리의 이해
# 예외의 종류 및 처리 방법에 대한 기본 개념
# SyntaxError, TypeError, NameError, IndexError, ValueError, KeyError 등 다양함
# 문법적으로는 오류가 없어도, 실행 단계에서 예외 발생 가능
# 예외 처리의 4가지 원칙
# 1. 예외는 반드시 처리해야 한다.
# 2. 로그는 반드시 남긴다.
# 3. 예외는 던져질 수 있다. (다른 곳에서 처리 가능)
# 4. 예외를 무시할 수도 있지만, 좋은 습관은 아니다.
# SyntaxError : 문법 오류
# print('error)
# print('error'))
# if True
# pass
# NameError : 존재하지 않는 변수를 참조할 때 발생
# a = 10
# b = 20
# print(c)
# ZeroDivisionError : 0으로 나눌 때 발생
# print(100 / 0)
# IndexError : 인덱스 범위를 벗어난 경우
# x = [50, 70, 90]
# print(x[1]) # 정상
# print(x[5]) # IndexError
# print(x.pop()) # 정상
# print(x.pop()) # 정상
# print(x.pop()) # 정상
# print(x.pop()) # 빈 리스트에서 pop 호출 → IndexError
# KeyError : 딕셔너리에 존재하지 않는 키를 참조할 때
# dic = {'name': 'Lee', 'Age': 18, 'City': 'Seoul'}
# print(dic['name']) # 정상
# print(dic['Age']) # 정상
# print(dic['City']) # 정상
# print(dic['Hobby']) # KeyError
# print(dic.get('Hobby')) # get() 사용 시 None 반환 → 안전
# 예외가 발생하지 않는다고 가정하고 프로그램 작성 후,
# 런타임 시 예외가 발생하면 처리하는 방식 권장 (EAFP: Easier to Ask Forgiveness than Permission)
# AttributeError : 존재하지 않는 속성 접근 시 발생
# import time
# print(time.time()) # 정상
# print(time.time2()) # AttributeError
# ValueError : 잘못된 값을 전달할 때 발생
# x = [10, 50, 90]
# x.remove(50) # 정상
# print(x)
# x.remove(100) # ValueError (존재하지 않는 값 제거 시)
# FileNotFoundError : 존재하지 않는 파일을 열 때
# f = open('test.txt')
# TypeError : 자료형이 맞지 않을 때
# x = [1, 2]
# y = (1, 2)
# z = 'test'
# print(x + y) # TypeError (list + tuple 불가)
# print(x + z) # TypeError
# print(y + z) # TypeError
# print(x + list(y)) # 정상 (list로 변환)
# 예외 처리 구문 구조
# try : 예외 발생 가능성이 있는 코드 작성
# except : 예외 발생 시 처리할 코드
# else : 예외가 발생하지 않았을 때 실행되는 코드
# finally : 항상 실행되는 코드 (예외 발생 여부 상관없음)
name = ['Kim', 'Lee', 'Park']
# 예제 1 : 특정 값이 리스트에 존재하는지 검사
try:
z = 'Kim' # 'Cho'로 변경 시 except 실행
x = name.index(z)
print('Found it! {} in name.'.format(z, x + 1))
except ValueError:
print('Not found it! - Occured a ValueError!')
else:
print('OK! else.')
print()
# 예제 2 : Exception으로 일반화한 예외 처리
try:
z = 'Kim'
x = name.index(z)
print('Found it! {} in name.'.format(z, x + 1))
except Exception:
print('Not found it! - Occured a ValueError!')
else:
print('OK! else.')
print()
# 예제 3 : 예외 객체(e)로 에러 메시지 출력
try:
z = 'Cho'
x = name.index(z)
print('Found it! {} in name.'.format(z, x + 1))
except Exception as e:
print(e)
print('Not found it! - Occured a ValueError!')
else:
print('OK! else.')
finally:
print('OK! finally.')
print()
# 예제 4 : 직접 예외 발생시키기 (raise)
try:
a = 'Park'
if a == 'Kim': # 'Park'일 경우 else 블록 실행
print('OK! Pass!')
else:
raise ValueError
except ValueError:
print('Occured a ValueError!')
else:
print('OK! else.')