python 예외처리

Exception Handling

  • 구문 에러(Syntax Error)

    • 문법적 에러
    • IDE에서는 구문에러 체크해줌
    • 파이썬은 상대적으로 문법이 간단해서 에러 발생 비율이 낮거나 다른 도구로 제거 가능
  • 예외(Exception)

    • 구문 에러는 없으나 프로그램 실행 중 더 이상 진행할 수 없는 경우
    • 예외가 발생하면 프로그램이 종료됨
    1. NameError (정의되지 않은 변수 사용)

      1
      4 + boo*3
    2. ZeroDivisionError (0으로 나누는 경우)

      1
      2
      3
      a = 10
      b = 0
      c = a / b
    3. TypeError (ex: 문자열 + 수치형 자료)

      1
      '2' + 2
    4. IndexError (참조 범위를 넘어서 인덱스 사용)

      1
      2
      l = [1,2]
      print l[2]
    5. KeyError (등록되지 않은 키로 사전 검색)

      1
      2
      d = {"a":1, "b":2}
      print d['c']
    6. IOError (존재하지 않는 파일을 열고자 할 때)

      1
      a = open('aaa.txt')

예외 처리 방법

  1. try,except,else,finally절 사용하기

    • 예외가 발생할 만한 상황을 예상하여 상황별로 전체 코드 흐름을 제어할 수 있다
    • try,except,else,finally

      • 구조
        1
        2
        3
        4
        5
        6
        7
        8
        try:
        (예외 발생 가능한) 일반적인 수행문들
        except Exception:
        예외가 발생하였을 때 수행되는 문들
        else:
        예외가 발생하지 않았을 때 수행되는 문들
        finally:
        예외 발생 유무와 관계없이 무조건 수행되는 문들

  • 예외 처리를 하면 예외 발생시 프로그램이 종료되지 않는다.

    1
    2
    3
    4
    5
    a = 0
    try:
    print 1.0/a
    except ZeroDivisionError:
    print 'zero division error!!!'
  • msg변수: ZeroDivisionError를 정의한 사람이 발생될 때 주는 메시지
    ex: float division by zero

    1
    2
    3
    4
    5
    6
    7
    8
    def division():
    for n in range(0, 5):
    try:
    print 10.0 / n
    except ZeroDivisionError, msg
    print msg

    division()
  • try절 안에서 간접적으로 호출한 함수의 내부 예외도 처리 가능

    1
    2
    3
    4
    try:
    spam()
    except NameError, msg:
    print 'Error -', msg

    ,대신 as로도 사용가능

    1
    2
    3
    4
    5
    # 위와 동일한 예제
    try:
    spam()
    except NameError as msg:
    print 'Error -', msg
  • except뒤에 예외를 명시하지 않으면 모든 예외에 대해 처리됨

    1
    2
    3
    4
    5
    try:
    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
    17
    b = 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
    9
    def dosomething():
    a = 1/0

    try:
    dosomething()
    except ZeroDivisionError:
    print "ZeroDivisionError occured"
    except ArithmeticError:
    print "ArithmeticError occured"
Comments