언어 및 용어 정리/Python

파이썬 - 에러 & 예외처리

익명의 신디 2020. 3. 28. 23:42

파이썬 - 에러 & 예외처리


1 문법 에러 (Syntax Error)

파이썬 실행시, 에러 문제 발생 파일이름File"<>", line 줄번호, ^(화살표, ^, parser)로 위치를 표현

^ 화살표는 문제 발생 위치를 제대로 가리키지 않을 수 있다...

 

# 문법 오류 (: 가 빠졌거나)

   SyntaxError: invalid syntax

 

# EOL 오류(따옴표 열고닫기 처리 오류, 괄호닫기 오류) 

   SyntaxError: EOL while scanning string literal

 


2 예외 (Exceptions)

- 문법이나 표현식이 바르게 쓴 줄 알았는데... 실행시 발생하는 에러의 종류


TypeError:

# a. 자료형 타입 자체가 잘못 되었을 때

print(1+'1')

   TypeError: unsupported operand type(s) for +: 'int' and 'str'

 

# b. 함수 내에서 처리 할 수 없는 자료형을 넣을 때

print(round('3.8'))

   TypeError: type str doesn't define __round__ method

 

# c. 함수 내에 argumnet 갯수가 맞지 않을 때, 갯수가 부족하거나 더 많을 때

import random

random.sample(1) 

  TypeError: sample() missing 1 required positional argument: 'k'


random.choice(1,2)

  TypeError: choice() takes 2 positional arguments but 3 were given

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

ValueError

# a. 자료형 타입은 올바르나 , 값이 적절하지 않을 때 (float 는 int가 안되..)

int('3') # OK

int('3.3') # ValueError

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

 

# b. 찾는게 없는데 찾으려고 , 값이 적절하지 않을 때 

number = [1,2] 
number.index(1) # ()괄호 속 1이란 값이 있는 인덱스번호를 리턴해주는 함수, 답 0
number.index(3) # ValueError

  ValueError: 3 is not in list

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

 

# 0으로 나눌 때

   ZeroDivisionError: division by zero

 

# 인덱스 범위 밖을 보려고 할 때 (처음에 되게 많이 봤던...)

   IndexError: list index out of range

 

# 정의되지 않은 변수를 호출 하였을 경우(지역 전역이름 공간 내 유효하지 않는 이름일 때)

   NameError: name '---' is not defined

 

# 딕셔너리에서 Key가 없는데 부르려고 할 때 발생

singer = {'bts':'on'}

print(singer['iu'])

   KeyError: 'iu' 

 

# 모듈을 찾을 수 없을 때 (import --- 할 때)

   ModuleNotFoundError: No module named '---'

# # 모듈을 찾았으나 가져오는 과정에서 실패하는 경우

???

 

# 무한 루프 돌아서 ctrl+c 눌러서 중지/강제 종료 할 때 

   KeyboardInterrupt:

 

 


3 예외 처리 try - except 

3-1 try - except 

  • try 절이 실행 한다. 그러다가 
  • 예외가 발생되지 않으면, except의 실행 없이 종료
  • 예외가 중간에 발생하면, except가 실행 (그 에러발생지점 뒤 try 의 남는 부분은 더 수행하지 않음)
  • - 에러가 순차적으로 수행됨으로, 가장 작은 범주부터 시작해야 함
try:
    코드 
except 예외종류:
    코드
기본구조

try: 
    코드 
except 예외종류1: 
    코드
except 예외종류2: 
    코드

복수의 예외선언
try: 
    코드 
except (예외1,예외2): 
    코드

복수의 예외선언
튜플로 처리하기

try: 
    코드 
except: # 모든 에러
    코드
예상못할 기타등등에러들에 대비하기

 

** 예외의 에러 발생 시, 메세지 출력도 가능

try: 
    코드 
except 예외종류 as err:
    코드

try:
    em = []
    print(em[-1])
    print("no problem") # 에러시 더 실행안함
except IndexError as err:
    print(f'{err} 의 오류가 발생했어')

list index out of range 의 오류가 발생했어

3-2 else 

  • except 절들이 모두 끝난 뒤에 와야 한다.
  • try 절이 예외를 일으키지 않을 때, <실행되어야만 하는 코드> 문장은 else 이용한다.

3-3 finally 

  • except 절들이 모두 끝난 뒤에 와야 한다.
  • try 절이 예외의 발생여부와 관계없이, <반드시 실행되어야만 하는 코드> 문장은 finally 이용한다.

try: 
    코드 
except 예외종류: 
    코드
else:
    코드

에러없을때는 else

try: 
    코드 
except 예외종류: 
    코드
finally:
    코드

에러무관 finally

 

4 예외 발생시키기

 

4-1 raise 강제 에러 발생

항상 예외를 발생시키고, 지정한 예외가 발생한다

내가 원하는 에러 문구 뜨기 가능

rasie 에러이름("원하는에러문구")

 

4-2 assert 

assert Boolean expression, error message

assert 검증식, "원하는에러메세지문구"

검증식이 거짓일 경우, AssertionError 발생