Exception raise
raise
로 예외 발생하기
- 예외를 특정 상황 조건에서
raise
키워드를 통해 발생시킬 수 있다. 아래 예는 시퀀스 형 클래스를 설계할 때 인덱싱을 구현하는
__getitem__
메소드에서 인덱스가 범위를 넘을 때IndexError
를 발생시킨다.1
2
3
4
5
6
7
8
9
10
11
12
13
14
15class SquareSeq:
def __init__(self, n):
self.n = n
def __getitem__(self,k):
if k >= self.n or k < 0:
raise IndexError # 인덱스 범위를 벗어나나면 IndexError발생
return k * k
def __len_(self):
return self.n
s = SquareSeq(10)
print s[2], s[4]
for x in s: # IndexError가 발생하는 시점까지 반복
print x,
print s[20] # 인덱스 범위를 넘음
사용자 정의 예외 클래스
- 일반적으로
Exception
클래스를 상속 받아 구현
(나머지 예외들은 일반적으로 나타나기 힘든 예외들이다) - 예외 발생 방법
- 내장 예외 발생 방법과 동일하게
raise [클래스 인스턴스]
와 같이 해당 예외 클래스의 인스턴스를 던진다
- 내장 예외 발생 방법과 동일하게
- 사용자 정의 예외를 잡는 방법
except [클래스이름]
과 같이 해당 예외 클래스의 이름을 사용한다.
아래 예에서
except Big
이 잡는 예외는Big
과Small
이다
->Small
은Big
의 하위 클래스 이기 때문1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18class Big(Exception):
pass
class Small(Big):
pass
def dosomething1():
x = Big()
raise x # x는 예외객체이므로 raise가능
def dosomething2():
raise Small()
for f in (dosomething1, dosomething2):
try:
f()
except Big:
print "Exception occurs!"
예외값 전달하기
raise
키워드 뒤에 예외와 함께, 추가 메시지를 함께 던질 수 있다.1
2
3
4
5
6
7def f():
raise Exception, 'message!!!'
try:
f()
except Exception, a:
print a생성자 안에 넣어준 에러 메시지는
except
키워드 사용시에 두 번째 인자로 해당 메시지를 받을 수 있다.1
2
3
4
5
6
7
8a = 10
b = 0
try:
if b == 0:
raise ArithmeticError('0으로 나누고 있습니다.')
a/b
except ArithmeticError, v:
print v