[패스트캠퍼스python] 예외처리

파이썬 인강 : 예외처리

완벽한 코딩은 없다. 여러 사람이 함께 작업한다한들 예외는 언제든지 나타날수있다
만약 미세한 코딩으로인해 수백명이 결제하는 회사 시스템에 예외가 발생해버린다면 그 손해는 막심할 것이다.

1. 예외 종류

  • SyntaxError
  • TypeError
  • NameError
  • IndexError
  • ValueError
  • KeyError.. 등등

요즘은 문법적으로 에러는 없지만 코드 실행(런타임) 프로세스에서 발생하는 예외 처리가 중요하다
에디터에서 linter가 문법적인 에러를 잡아주기때문에 걱정없지만 런타임에서 발생하는 에러에 주의해야한다

항상 예외가 발생하지 않을 것으로 가정하고 먼저 코딩
그 후 런타임 예외 발생 시 예외처리 권장(EAFP 코딩 스타일)

1. SyntaxError : 잘못된 문법

문법적인 에러는 보통 linter가 잡아준다

1
2
3
4
5
print('test)     # ' 누락

if True # : 누락
pass
x => y # 작거나 같다는 >=로 해야함

2. NameError : 참조 변수 없음

1
2
3
a = 10
b = 15
print(c) # 예외 발생

3. ZeroDivisionError : 0 나누기 에러

모든 언어에 있는 에러이고 런타임에서 발생하는 에러이기에 중요하다

1
print(10 / 0)

4. IndexError : 인덱스 범위 오버

자주 발생하는 에러

1
2
3
4
5
6
7
8
9
x = [10, 20, 30]

print(x[1])
print(x[3]) # 예외 발생
print(x.pop())
print(x.pop())
print(x.pop())
print(x.pop()) # 예외 발생
print(x.pop(50)) # 예외 발생

5. KeyError

주로 딕셔너리에서 나오는 에러이다

1
2
3
dic = {'name': 'Kim', 'Age': 33, 'City': 'Seoul'}

print(dic['hobby']) # 키가 존재하지 않으면 예외

이런 에러를 방지하기 위해 get매서드를 사용하면 좋다

1
print(dic.get('hobby')) # 안전

6. AttributeError : 모듈, 클래스에 있는 잘못된 속성 사용시에 예외

1
2
3
4
x = [1, 2, 3]
print(x.append(4))
print(x)
print(x.add(10))

출력값은

list는 add가 없기에 AttributeError발생한다

7. ValueError : 참조 값이 없을 때 예외

1
2
3
4
t = (10, 100, 1000)

print(t.index(100))
print(t.index(7)) # 예외 발생

8. FileNotFoundError

외부파일을 불러와서 처리할때 자주 발생

터미널에 보면 디렉토리 내에 찾을 수 없다고 나온다

9. TypeError : 자료형에 맞지 않는 연산을 수행 할 경우

1
2
3
4
5
6
x = [1, 2]
y = (1, 2)
z = 'test'

print(x + y) # 예외 발생(튜플과 리스트를 결합할수없다 -> 그래서 형변환이 중요)
print(sum([1,2,3],10,1)) # 예외 발생(자료형불일치)

2. 예외 처리 기본

아래 예외 처리는 기본중의 기본이므로 꼭 알아둬야한다.

1
2
3
4
5
6
try               에러가 발생 할 가능성이 있는 코드 실행
except 에러명1: 에러가 발생하면 여기서 처리(여러 개 가능)
except 에러명2:
except 에러명3:
else: try 블록의 에러가 없을 경우 실행
finally: 항상 실행

이를 활용한 예시

1
2
3
4
5
6
7
8
try:
z = 'Kim' # 'Cho' 예외 발생
x = name.index(z)
print('{} Found it! {} in name'.format(z, x + 1))
except: # 모든 에러를 처리(Exception)
print('Not found it! - Occurred ValueError!')
else:
print('ok! else!')