예외(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

+ Recent posts