파이썬 - 에러 & 예외처리
파이썬 - 에러 & 예외처리
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: |
복수의 예외선언 |
try: 코드 except (예외1,예외2): 코드 |
복수의 예외선언 |
try: 코드 except: # 모든 에러 코드 |
예상못할 기타등등에러들에 대비하기 |
** 예외의 에러 발생 시, 메세지 출력도 가능
try: 코드 except 예외종류 as err: 코드 |
try: |
list index out of range 의 오류가 발생했어 |
3-2 else
- except 절들이 모두 끝난 뒤에 와야 한다.
- try 절이 예외를 일으키지 않을 때, <실행되어야만 하는 코드> 문장은 else 이용한다.
3-3 finally
- except 절들이 모두 끝난 뒤에 와야 한다.
- try 절이 예외의 발생여부와 관계없이, <반드시 실행되어야만 하는 코드> 문장은 finally 이용한다.
try: |
에러없을때는 else |
try: |
에러무관 finally |
4 예외 발생시키기
4-1 raise 강제 에러 발생
항상 예외를 발생시키고, 지정한 예외가 발생한다
내가 원하는 에러 문구 뜨기 가능
4-2 assert
assert Boolean expression, error message
assert 검증식, "원하는에러메세지문구"
검증식이 거짓일 경우, AssertionError 발생