예외(Exception)
# 파이썬 예외처리의 이해
##예외는 우리가 작성한 코드에서 비정상적으로 발생하는 이벤트
##에러는 예외와 다르게 운영환경에서 발생 ex)정전,하드웨어적인 고장
##예외를 에러의 범주에 포함하기도 한다. 그러니 나눠서 외우지 말자.
예외(Exception)개념 및 처리
예외 종류
다양한 예외 재연
예외 처리 기본
예외 처리 패턴
예외 처리 실습
# 예외 종류
# SyntaxError, TypeError, NameError, IndexError, ValueError, KeyError....
# 문법적으로는 예외가 없지만, 코드 실행 프로세스(단계)발생하는 예외도 중요
#(나는 이렇게 만들었는데 사용자가 전혀 다른 값으로 입력했을 때)
# 1. 예외는 반드시 처리
# 2. 로그는 반드시 남긴다.(어떤 예외가 발생했었는지를 기록으로 남기는 것)
# 3. 예외는 던져진다.(다른 데로 처리를 위임할 수 있다.)
# 4. 예외 무시(권장 x)
# SyntaxError : 문법 오류
print('error) #SyntaxError: EOL while scanning string literal
print('error')) #SyntaxError: unmatched ')'
if True #SyntaxError: invalid syntax
pass
# NameError : 참조 없음(없는 변수를 참조할 때)
a = 10
b = 15
print(c) #NameError: name 'c' is not defined
# ZeroDivisionError
print(100 / 0) #ZeroDivisionError: division by zero
#100을 0으로 나누는 것
# IndexError
x = [50, 70, 90]
print(x[1])
print(x[4]) #IndexError: list index out of range
print(x.pop())
print(x.pop())
print(x.pop())
print(x.pop()) #IndexError: pop from empty list
# KeyError
dic = {'name': 'Lee', 'Age': 41, 'City': 'Busan'}
print(dic['hobby']) #KeyError: 'hobby'
print(dic.get('hobby')) #None get메소드는 예외를 발생시키지 않고 없으면 None을 가져온다.
# 예외 없는 것을 가정하고 프로그램 작성 -> 런타임(실행할 때) 예외 발생 시 예외 처리 권장(EAFP)
# AttributeError : 모듈, 클래스에 있는 잘못된 속성 사용 예외
import time
print(time.time2()) #AttributeError: module 'time' has no attribute 'time2'
#time모듈에서는 time2라는 메소드가 없기 때문에 attributeerror가 나온다.
# ValueError 어떤 자료구조 안에서, 어떤 데이터를 참조하려고 하는데 그때 존재하지 않을 때
x = [10, 50, 90]
x.remove(50)
print(x) #[10, 90]
x.remove(200) #ValueError: list.remove(x): x not in list
# FileNotFoundError
f = open('test.txt') #FileNotFoundError: [Errno 2] No such file or directory: 'test.txt'
# test.txt.파일이 없기 때문에
# TypeError : 자료형에 맞지 않는 연산을 수행 할 경우 ex)숫자+문자
x = [1,2]
y = (1,2)
z = 'test'
print(x + y) #TypeError: can only concatenate list (not "tuple") to list
print(x + z) #TypeError: can only concatenate list (not "str") to list
print(y + z) #TypeError: can only concatenate tuple (not "str") to tuple
print(x + list(y)) #[1, 2, 1, 2]
print(x + list(z)) #[1, 2, 't', 'e', 's', 't']
# 예외 처리 기본
# try : 에러가 발생 할 가능성이 있는 코드 실행
# except 에러명1: 여러개 가능
# except 에러명2:
# else : try 블록의 에러가 없을 경우 실행
# finally : 항상 마지막에 실행
name = ['Kim', 'Lee', 'Park']
# 예제1
try:
z = 'Kim' # 'Cho'를 적으면 else문이 실행되지 않는다.
x = name.index(z)
print('{} Found it! {} in name'.format(z, x + 1))
except ValueError:
print('Not found it! - Occurred ValueError!')
else:
print('Ok! else.')
#Kim Found it! 1 in name
#Ok! else.
#Not found it! - Occurred ValueError! <- z = 'Cho'를 적었을 때
# 예제2
try:
z = 'Cho' # 'Cho'
x = name.index(z)
print('{} Found it! {} in name'.format(z, x + 1))
except: #except Exception으로 적어도 됨 이렇게 하면 모든 에러를 다잡지만 정확히 어떤 에러인지는 모른다.
print('Not found it! - Occurred ValueError!')
else:
print('Ok! else.')
#Not found it! - Occurred ValueError!
# 예제3
try:
z = 'Cho' # 'Cho'
x = name.index(z)
print('{} Found it! {} in name'.format(z, x + 1))
except Exception as e: #alias를 주고 출력을 할 수도 있다.
print(e)
print('Not found it! - Occurred ValueError!')
else:
print('Ok! else.')
finally:
print('Ok! finally') #예외가 발생해도 실행됨. 무조건 한 번 실행한다.
#'Cho' is not in list <- print(e)
#Not found it! - Occurred ValueError!
#Ok! finally
# 예제4
# 예외 발생 : raise
# raise 키워드로 예외 직접 발생
try:
a = 'Park'
if a == 'Park':
print('OK! Pass!')
else:
raise ValueError #직접 valueError를 발생시키는 것
except ValueError:
print('Occurred! Exception!')
else:
print('Ok! else!')
#OK! Pass!
#Ok! else!
#Occurred! Exception! <- a = 'kim'일 경우
'Python > Today I learned' 카테고리의 다른 글
TIL#31 외장함수 (0) | 2021.05.19 |
---|---|
TIL#30 내장함수 (0) | 2021.05.19 |
TIL#28 import error 상대경로 절대경로 (0) | 2021.05.18 |
TIL#27 패키지와 import (0) | 2021.05.18 |
TIL#26 모듈과 import, sys.path (0) | 2021.05.18 |