에러

  • 기본적인 에러 종류
종류 설명
ValueError 부적절한 값을 가진 인자를 받았을 때 발생
IndexError 범위를 벗어난 index에 접근하려 하는 경우 발생
SyntaxError 문법 오류가 발생하는 경우 발생
NameError 지역변수, 전역 변수 이름을 찾을 수 없을 때 발생
ZeroDivisionError 0으로 나누려는 경우에 발생
FileNotFoundError 일이나 디렉터리에 접근하려 할 때, 해당 파일이나 디렉터리가 없는 경우 발생
TypeError 잘못된 타입을 전달했을 때 발생
AttributeError 어트리뷰트 참조나 대입이 실패한 경우에 발생
KeyError 셔너리에서 접근하려는 키 값이 없을 때 발생
OverFlowError 연산의 결과가 너무 커서 데이터 타입이 표현할 수 있는 숫자의 범위를 넘어가는 경우에 발생
기타 에러 문서
4/0
# ZeroDivisionError: division by zero
# 0으로 나눌수 없음

noname + 3
# NameError: name 'noname' is not defined
# noname이 정의되지 않음

'1'+1
# TypeError: can only concatenate str (not "int") to str
# 문자열과 정수는 계산할 수 없음

int("string")
# ValueError: invalid literal for int() with base 10: 'string'
# 문자열을 int형으로 변환할 수 없음

에러 발생

  • 파이썬에서는 raise를 이용해 의도적으로 에러를 일으킬 수 있음
raise ZeroDivisionError("숫자를 0으로 나눴습니다")
# ZeroDivisionError: 숫자를 0으로 나눴습니다

raise NameError("지역 또는 전역 변수를 찾을 수 없음")
# NameError: 지역 또는 전역 변수를 찾을 수 없음
---------------------------------------------------------------------------

ZeroDivisionError                         Traceback (most recent call last)

c:\Users\andon\project\python_base\16. 에러와예외처리.ipynb 셀 4 in <cell line: 1>()
----> <a href='vscode-notebook-cell:/c%3A/Users/andon/project/python_base/16.%20%EC%97%90%EB%9F%AC%EC%99%80%EC%98%88%EC%99%B8%EC%B2%98%EB%A6%AC.ipynb#W4sZmlsZQ%3D%3D?line=0'>1</a> raise ZeroDivisionError("숫자를 0으로 나눴습니다")
      <a href='vscode-notebook-cell:/c%3A/Users/andon/project/python_base/16.%20%EC%97%90%EB%9F%AC%EC%99%80%EC%98%88%EC%99%B8%EC%B2%98%EB%A6%AC.ipynb#W4sZmlsZQ%3D%3D?line=1'>2</a> # ZeroDivisionError: 숫자를 0으로 나눴습니다
      <a href='vscode-notebook-cell:/c%3A/Users/andon/project/python_base/16.%20%EC%97%90%EB%9F%AC%EC%99%80%EC%98%88%EC%99%B8%EC%B2%98%EB%A6%AC.ipynb#W4sZmlsZQ%3D%3D?line=3'>4</a> raise NameError("지역 또는 전역 변수를 찾을 수 없음")


ZeroDivisionError: 숫자를 0으로 나눴습니다

사용자지정 에러

  • 프로그래밍시 특수한 경우에만 예외 처리를 하기 위해 사용자지정 에러를 사용
  • 파이썬 내장 클래스인 Exception클래스를 상속하여 만들 수 있음
class MyError(Exception):
    pass
def say_hi(str):
    if str == "hi":
        raise MyError()
    else:
        print(str)
    
say_hi("hello")    
say_hi("hi")
hello



---------------------------------------------------------------------------

MyError                                   Traceback (most recent call last)

c:\Users\andon\project\python_base\16. 에러와예외처리.ipynb 셀 7 in <cell line: 8>()
      <a href='vscode-notebook-cell:/c%3A/Users/andon/project/python_base/16.%20%EC%97%90%EB%9F%AC%EC%99%80%EC%98%88%EC%99%B8%EC%B2%98%EB%A6%AC.ipynb#X10sZmlsZQ%3D%3D?line=4'>5</a>         print(str)
      <a href='vscode-notebook-cell:/c%3A/Users/andon/project/python_base/16.%20%EC%97%90%EB%9F%AC%EC%99%80%EC%98%88%EC%99%B8%EC%B2%98%EB%A6%AC.ipynb#X10sZmlsZQ%3D%3D?line=6'>7</a> say_hi("hello")    
----> <a href='vscode-notebook-cell:/c%3A/Users/andon/project/python_base/16.%20%EC%97%90%EB%9F%AC%EC%99%80%EC%98%88%EC%99%B8%EC%B2%98%EB%A6%AC.ipynb#X10sZmlsZQ%3D%3D?line=7'>8</a> say_hi("hi")


c:\Users\andon\project\python_base\16. 에러와예외처리.ipynb 셀 7 in say_hi(str)
      <a href='vscode-notebook-cell:/c%3A/Users/andon/project/python_base/16.%20%EC%97%90%EB%9F%AC%EC%99%80%EC%98%88%EC%99%B8%EC%B2%98%EB%A6%AC.ipynb#X10sZmlsZQ%3D%3D?line=0'>1</a> def say_hi(str):
      <a href='vscode-notebook-cell:/c%3A/Users/andon/project/python_base/16.%20%EC%97%90%EB%9F%AC%EC%99%80%EC%98%88%EC%99%B8%EC%B2%98%EB%A6%AC.ipynb#X10sZmlsZQ%3D%3D?line=1'>2</a>     if str == "hi":
----> <a href='vscode-notebook-cell:/c%3A/Users/andon/project/python_base/16.%20%EC%97%90%EB%9F%AC%EC%99%80%EC%98%88%EC%99%B8%EC%B2%98%EB%A6%AC.ipynb#X10sZmlsZQ%3D%3D?line=2'>3</a>         raise MyError()
      <a href='vscode-notebook-cell:/c%3A/Users/andon/project/python_base/16.%20%EC%97%90%EB%9F%AC%EC%99%80%EC%98%88%EC%99%B8%EC%B2%98%EB%A6%AC.ipynb#X10sZmlsZQ%3D%3D?line=3'>4</a>     else:
      <a href='vscode-notebook-cell:/c%3A/Users/andon/project/python_base/16.%20%EC%97%90%EB%9F%AC%EC%99%80%EC%98%88%EC%99%B8%EC%B2%98%EB%A6%AC.ipynb#X10sZmlsZQ%3D%3D?line=4'>5</a>         print(str)


MyError: 

예외 처리

  • 프로그래밍 중 오류가 발생하면 프로그램이 중단되지 않고 예외를 처리하는것

try except

  • try 블록 수행중 오류가 발생하면 except 블록이 실행. 오류가 발생하지 않으면 except 블록은 실행되지 않음
  • 에러 분류에 따라 처리할수도 있음. 만약 에러 분류가 잘못된 경우 예외처리는 되지 않고 프로그램 중단 후 오류 출력
  • 오류 메시지까지 출력하고 싶을때는 as 예약어로 할당이 가능
try:
    print(3/0)
except:
    print("Error")

try:
    4 / 0
except ZeroDivisionError as error:
    print(error)

# 이 에러는 ZeroDivisionError인데 AttributeError로 처리하면 오류발생
try:
    print(3/0)
except AttributeError:
    print("AttributeError")
Error
division by zero



---------------------------------------------------------------------------

ZeroDivisionError                         Traceback (most recent call last)

c:\Users\andon\project\python_base\16. 에러와예외처리.ipynb 셀 10 in <cell line: 12>()
     <a href='vscode-notebook-cell:/c%3A/Users/andon/project/python_base/16.%20%EC%97%90%EB%9F%AC%EC%99%80%EC%98%88%EC%99%B8%EC%B2%98%EB%A6%AC.ipynb#X20sZmlsZQ%3D%3D?line=10'>11</a> # 이 에러는 ZeroDivisionError인데 AttributeError로 처리하면 오류발생
     <a href='vscode-notebook-cell:/c%3A/Users/andon/project/python_base/16.%20%EC%97%90%EB%9F%AC%EC%99%80%EC%98%88%EC%99%B8%EC%B2%98%EB%A6%AC.ipynb#X20sZmlsZQ%3D%3D?line=11'>12</a> try:
---> <a href='vscode-notebook-cell:/c%3A/Users/andon/project/python_base/16.%20%EC%97%90%EB%9F%AC%EC%99%80%EC%98%88%EC%99%B8%EC%B2%98%EB%A6%AC.ipynb#X20sZmlsZQ%3D%3D?line=12'>13</a>     print(3/0)
     <a href='vscode-notebook-cell:/c%3A/Users/andon/project/python_base/16.%20%EC%97%90%EB%9F%AC%EC%99%80%EC%98%88%EC%99%B8%EC%B2%98%EB%A6%AC.ipynb#X20sZmlsZQ%3D%3D?line=13'>14</a> except AttributeError:
     <a href='vscode-notebook-cell:/c%3A/Users/andon/project/python_base/16.%20%EC%97%90%EB%9F%AC%EC%99%80%EC%98%88%EC%99%B8%EC%B2%98%EB%A6%AC.ipynb#X20sZmlsZQ%3D%3D?line=14'>15</a>     print("AttributeError")


ZeroDivisionError: division by zero

try finally

  • finallytry문 수행 도중 예외 발생 여부에 상관없이 항상 수행
  • 보통 사용한 리소스를 close해야할 때 많이 사용
try:
    f = open("f.txt", "r")
except FileNotFoundError as e:
    print(e)
finally:
    print("무조건 실행")
[Errno 2] No such file or directory: 'f.txt'
무조건 실행

여러개의 예외처리하기

  • 2개 이상의 오류를 동일하게 처리하기 위해서 튜플을 사용하여 처리
try:
    a = [1,2]
    print(a[3]) # IndexError 에러가 먼저 발생했기 때문에 ZeroDivisionError는 발생안함
    4/0
except ZeroDivisionError as e:
    print(e)
except IndexError as e:
    print(e)
list index out of range
try:
    a = [1,2]
    4/0
    print(a[3])
except (ZeroDivisionError, IndexError) as e:
    print(e)
division by zero

try except else

  • try 문을 수행중 오류가 발생하면 except 문이 실행되고 오류가 없으면 else 문장이 실행
try:
    age = int("18")
except:
    print('입력이 정확하지 않습니다.')
else:
    if age <= 18:
        print('미성년자는 출입금지입니다.')
    else:
        print('환영합니다.')
        
try:
    age = int("abc")
except:
    print('입력이 정확하지 않습니다.')
else:
    if age <= 18:
        print('미성년자는 출입금지입니다.')
    else:
        print('환영합니다.')
미성년자는 출입금지입니다.
입력이 정확하지 않습니다.

사용자지정 예외처리

class MyError(Exception):
    pass

def say_hi(str):
    if str == "hi":
        raise MyError()
    else:
        print(str)
        
try:
    say_hi("hello")
    say_hi("hi")
except MyError as e:
    print(f"e: {e}")
    print("잘못입력")
hello
e: 
잘못입력

오류메시지 사용

  • 클래스에 __str__() 메서드를 구현해야함
class MyError(Exception):
    def __str__(self):
        return "허용되지 않음"

def say_hi(str):
    if str == "hi":
        raise MyError()
    else:
        print(str)
        
try:
    say_hi("hello")
    say_hi("hi")
except MyError as e:
    print(f"e: {e}")
    print("잘못입력")
hello
e: 허용되지 않음
잘못입력

카테고리:

업데이트:

댓글남기기