Exception Handling
구문 에러(Syntax Error)
- 문법적 에러
- IDE에서는 구문에러 체크해줌
- 파이썬은 상대적으로 문법이 간단해서 에러 발생 비율이 낮거나 다른 도구로 제거 가능
예외(Exception)
- 구문 에러는 없으나 프로그램 실행 중 더 이상 진행할 수 없는 경우
- 예외가 발생하면 프로그램이 종료됨
NameError
(정의되지 않은 변수 사용)1
4 + boo*3
ZeroDivisionError
(0
으로 나누는 경우)1
2
3a = 10
b = 0
c = a / bTypeError
(ex: 문자열 + 수치형 자료)1
'2' + 2
IndexError
(참조 범위를 넘어서 인덱스 사용)1
2l = [1,2]
print l[2]KeyError
(등록되지 않은 키로 사전 검색)1
2d = {"a":1, "b":2}
print d['c']IOError
(존재하지 않는 파일을 열고자 할 때)1
a = open('aaa.txt')
예외 처리 방법
try
,except
,else
,finally
절 사용하기- 예외가 발생할 만한 상황을 예상하여 상황별로 전체 코드 흐름을 제어할 수 있다
try
,except
,else
,finally
절- 구조
1
2
3
4
5
6
7
8try:
(예외 발생 가능한) 일반적인 수행문들
except Exception:
예외가 발생하였을 때 수행되는 문들
else:
예외가 발생하지 않았을 때 수행되는 문들
finally:
예외 발생 유무와 관계없이 무조건 수행되는 문들
- 구조
예외 처리를 하면 예외 발생시 프로그램이 종료되지 않는다.
1
2
3
4
5a = 0
try:
print 1.0/a
except ZeroDivisionError:
print 'zero division error!!!'msg
변수:ZeroDivisionError
를 정의한 사람이 발생될 때 주는 메시지
ex: float division by zero1
2
3
4
5
6
7
8def division():
for n in range(0, 5):
try:
print 10.0 / n
except ZeroDivisionError, msg
print msg
division()try
절 안에서 간접적으로 호출한 함수의 내부 예외도 처리 가능1
2
3
4try:
spam()
except NameError, msg:
print 'Error -', msg,
대신as
로도 사용가능1
2
3
4
5# 위와 동일한 예제
try:
spam()
except NameError as msg:
print 'Error -', msgexcept
뒤에 예외를 명시하지 않으면 모든 예외에 대해 처리됨1
2
3
4
5try:
spam()
print 1.0/0.0
except:
print 'Error'여러 예외들 각각에 대해
except
절로 다중처리 가능1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17b = 0.0
name = 'aaa.txt'
try:
print 1.0 / b
spam()
f = open(name, 'r')
'2' + 2
except NameError:
print 'NameError !!!'
except ZeroDivisionError:
print 'ZeroDivisionError !!!'
excpet (TypeError, IOError):
print 'TypeError or IOERror !!!'
else:
print 'No Exception'
finally
print 'Exit !!!'
같은 부류의 예외 다 잡아내기
- 예외 클래스의 상속에 의한 계층 관계를 이용하여 여러 예외들을 한꺼번에 잡을 수 있다.
예를 들어,
ArithmeticError
의 하위 클래스로서FloatingPointError
,OverflowError
,ZeroDivisionError
가 존재하기 때문에 이들 하위 클래스 예외가 발생하면ArithmeticError
로 처리할 수 있다.예외가 임의의
except
에서 잡히면 다른except
에서는 잡히지 않는다.1
2
3
4
5
6
7
8
9def dosomething():
a = 1/0
try:
dosomething()
except ZeroDivisionError:
print "ZeroDivisionError occured"
except ArithmeticError:
print "ArithmeticError occured"