python 예외 발생시키기

Exception raise

raise로 예외 발생하기

  • 예외를 특정 상황 조건에서 raise키워드를 통해 발생시킬 수 있다.
  • 아래 예는 시퀀스 형 클래스를 설계할 때 인덱싱을 구현하는 __getitem__메소드에서 인덱스가 범위를 넘을 때 IndexError를 발생시킨다.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    class 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이 잡는 예외는 BigSmall이다
    -> SmallBig의 하위 클래스 이기 때문

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    class 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
    7
    def f():
    raise Exception, 'message!!!'

    try:
    f()
    except Exception, a:
    print a
  • 생성자 안에 넣어준 에러 메시지는 except키워드 사용시에 두 번째 인자로 해당 메시지를 받을 수 있다.

    1
    2
    3
    4
    5
    6
    7
    8
    a = 10
    b = 0
    try:
    if b == 0:
    raise ArithmeticError('0으로 나누고 있습니다.')
    a/b
    except ArithmeticError, v:
    print v
Comments