관리 메뉴

NineTwo meet you

[파이썬기초] 예외처리 본문

프로그래밍언어/파이썬

[파이썬기초] 예외처리

NineTwo 2020. 9. 25. 13:44
반응형

프로그램의 제어 흐름을 조정하기 위해 사용하는 이벤트를 예외라고 한다.

즉, 실행중에 감지되는 에러를 예외라고 부른다.

예외를 무시하고 프로그램을 정상적으로 실행할 수 있게 하는 것을 예외 처리하고 한다.

내장 예외 클래스 계층 구조

아래 설명을 해놓은 예외는 파란색으로 표시한다.

더보기
BaseException
+-- SystemExit
+-- KeyboardInterrupt
+-- GeneratorExit
+-- Exception
     +-- StopIteration
     +-- StopAsyncIteration
     +-- ArithmeticError
     |     +-- FloatingPointError
     |     +-- OverflowError
     |     +-- ZeroDivisionError
     +-- AssertionError
     +-- AttributeError
     +-- BufferError
     +-- EOFError
     +-- ImportError
     |      +-- ModuleNotFoundError
     +-- LookupError
     |      +-- IndexError
     |      +-- KeyError
     +-- MemoryError
     +-- NameError
     |      +-- UnboundLocalError
     +-- OSError
     |      +-- BlockingIOError
     |      +-- ChildProcessError
     |      +-- ConnectionError
     |      |      +-- BrokenPipeError
     |      |      +-- ConnectionAbortedError
     |      |      +-- ConnectionRefusedError
     |      |      +-- ConnectionResetError
     |      +-- FileExistsError
     |      +-- FileNotFoundError
     |      +-- InterruptedError
     |      +-- IsADirectoryError
     |      +-- NotADirectoryError
     |      +-- PermissionError
     |      +-- ProcessLookupError
     |      +-- TimeoutError
     +-- ReferenceError
     +-- RuntimeError
     |      +-- NotImplementedError
     |      +-- RecursionError
     +-- SyntaxError
     |      +-- IndentationError
     |           +-- TabError
     +-- SystemError
     +-- TypeError
     +-- ValueError
     |      +-- UnicodeError
     |           +-- UnicodeDecodeError
     |           +-- UnicodeEncodeError
     |           +-- UnicodeTranslateError
     +-- Warning
          +-- DeprecationWarning
          +-- PendingDeprecationWarning
          +-- RuntimeWarning
          +-- SyntaxWarning
          +-- UserWarning
          +-- FutureWarning
          +-- ImportWarning
          +-- UnicodeWarning
          +-- BytesWarning
          +-- ResourceWarning

FileNotFoundError

파일을 읽으려고 할때 읽으려는 파일이 존재하지 않을 때 발생하는 에러

>>>f = open('farm.txt','r')

FileNotFoundError : [Errno 2] No such file of directory: 'farm.txt'

ZeroDivisionError

0으로 나누려고 할 때 발생하는 에러

>>>12/0

ZeroDivisionError : Division by zero

IndexError

인덱스를 잘못 접근했을 때 발생하는 에러

>>>a = [1,2,3]
>>>a [5]

IndexError: list index out of range

SyntaxError

문법상 오류 시 발생하는 오류로 다양한 문법상의 오류가 존재.

>>>str = 'farm

SyntaxError: EOL while scanning string literal

tapError

들여 쓰기시 tap랑 space를 섞어서 쓴경우 발생하는 에러

>>> for i in range(5):
...     print("space")
...     print("tap")

TabError: inconsistent use of tabs and spaces in indentation

IndentationError

들여쓰기 에러

>>> a = 0
if a == 0:
    print("correct space")
     print("error space")

IndentationError: unexpected indent

NameError

존재하지 않은 변수를 불러들일 경우 발생하는 에러

>>> print(farm)

NameError: name 'farm' is not defined

RecursionError

자기 자신을 재호 출하는 재귀 함수를 선언한 뒤 재귀 함수의 종료조건이 설정되지 않을때 발생하는 오류

파이썬 3.5에 새로 추가된 오류

def recursion():
    recursion()

RecursionError: maximum recursion depth exceeded

RuntimeError

파이썬 3.5 이전 버전을 사용한다면 위의 재귀함수를 사용했을 때 RuntimeError가 발생한다.

물론 RecursionError와 RuntimeError는 같은 오류가 아니다.

AttributeError

존재하지 않는 속성을 쓰는 경우 발생하는 에러

>>> l = [1,2,3,4,5]
>>> l.keys()

AttributeError: 'list' object has no attribute 'keys'

ValueError

옳지 않은 속성이 올 경우 발생하는 에러

>>> int('str')

ValueError: invalid literal for int() with base 10: 'str'

TypeError

올바르지 않은 타입을 지정한 경우 발생하는 에러

KeyError

존재하지 않는 키를 사용할 경우 발생하는 에러

ModuleNotFoundError

존재하지 않는 모듈을 import 하는 경우 발생하는 에러

ImportError

import 하려는 모듈의 이름을 잘못 작성하거나 해당 모듈이 존재하지 않을 때 발생하는 에러


예외처리 방법

try, except만 사용

try에서 에러가 발생하면 예외 종류에 상관없이 except문이 실행되는 방법

try:
    수행할 문장 1
    수행할 문장 2
    ...
except:
    수행할 문장 A
    수행할 문장 B
    ....

try, except 발생 오류

try에서 특정 에러가 발생했을 때 except문이 실행되는 방법

try: 
  수행할 문장 1
    수행할 문장 2
    ...
except 발생 오류:
    수행할 문장 A
    수행할 문장 B
    ....

try, except 발생 오류 as 오류 메시지 변수

발생 오류와 오류메세지 변수까지 포함한 except문

try:
    수행할 문장 1
    수행할 문장 2
    ...
except 발생오류 as 오류 메시지 변수:
    print(오류 메시지 변수) # 이런 식으로 오류 메시지 변수를 사용할 수 있음
    수행할 문장 B
    ....

try, finally

예외 발생 여부에 상관없이 실행하고 싶은 문장이 있는 경우 finally사용

try: 
   수행할 문장 1
    수행할 문장 2
    ...
finally:
    수행할 문장 A
    수행할 문장 B
    ....

여러 개 오류 처리

각각의 오류 메시지를 보고 싶은 경우

try: 
    수행할 문장 1
    수행할 문장 2
    ...
except 발생 오류 1 as 오류 메시지 변수:
    수행할 문장 A
    수행할 문장 B
    ....
except 발생 오류 2 as 오류 메시지 변수:
    수행할 문장 A
    수행할 문장 B
    ....

한꺼번에 보고 싶은 경우

try: 
    수행할 문장 1
    수행할 문장 2
    ...
except (발생 오류 1, 발생 오류 2) as 오류 메시지 변수:
    수행할 문장 A
    수행할 문장 B
    ....

예외 회피

어떤 예외가 발생하더라도 그냥 넘어가는 방식

try: 
    수행할 문장 1
    수행할 문장 2
    ...
except:
    pass

예외 일으키기

일부러 예외를 발생시키고 싶다.

raise 발생 오류

예외 만들기

class 예외 클래스 이름(Exception):
    수행할 문장 1
    ...
if 조건:
    raise 예외 클래스 이름

 

반응형
Comments