Exception(예외) : 의도하지 않은 에러
my_list = [1,2,3]
print(my_list[4]) # 출력 : IndexError: list index out of range
list의 총 길이는 3이지만 4번째 인덱스의 값을 출력하려고 하니 exception이 발생한다.
파이썬에서 exception이 발생하면 곧바로 프로그램이 종료된다. 하지만 exception이 발생해도 남은 프로세스를 진행 한 후 발생한 exception을 따로 처리하는 방법이 있다. 이를 exception handling이라고 한다.
try :
# 문장 1
# 문장 2
except Exception :
# Exception이 발생할 경우 처리하는 코드
finally :
# Exception 여부와 상관 없이 항상 마지막에 실행되는 코드
맨 위에서 발생한 my_list배열의 인덱스 event에 try except문을 적용하여 exception handling을 해보자
def return_elem_or_minus_one(index) :
short_list=[1,2,3,4]
try :
elem = short_list[index]
print("exception이 발생되면 실행되지 않는 문장")
except IndexError :
print("IndexError exception이 발생되면 실행되는 문장")
elem = -1
finally :
print("exception 발생 여부와 상관없이 실행되는 문장")
return elem
answer = return_elem_or_minus_one(4)
print(answer)
'''
출력
exception이 발생되면 실행되는 문장
exception 발생 여부와 상관없이 실행되는 문장
-1
'''
하나하나씩 뜯어보자.
try 블록을 수행 중 오류가 발생하면 exception 블록이 수행된다. 하지만 try 블록에서 오류가 발생하지 않는다면 exception 블록은 수행되지 않는다.
try :
elem = short_list[index]
pritn("exception이 발생되면 실행되지 않는 문장")
short_list의 범위를 벗어난 연산을 수행할 경우 IndexError가 발생한다. 따라서 미리 정의한 exception IndexError 블록은 IndexError exception이 발생할 경우 실행된다.
except IndexError :
print("IndexError exception이 발생하면 실행되는 문장")
elem = -1
하나의 exception만이 아닌 여러개의 특정한 exception을 처리하기 위해 다음 구문을 사용할 수 있다.
except ZeroDivisionError :
print("0으로 나눌 수 없습니다.")
except IndexError :
print("인덱싱 할 수 없습니다.")
IndexError 뿐만이 아닌 한번에 다양한 exception을 잡고(catch) 싶다면 except Exception을 사용하면 된다.
except Exception :
print("모든 exception이 발생하면 실행되는 문장")
elem - 1
또한 Exception을 잡을 때 "as"문을 써서 해당 exception의 객체를 받아와 정보를 더 얻을 수 있다. exception이 발생한 객체를 e라고 정의하고 e를 출력해봤을때 list index out of range라는 exception 정보를 출력해봤다.
except Exception as e :
print(f"발생한 exception: {e}")
elem = -1
'''
출력
발생한 exception: list index out of range
'''
try문에서 exception이 발생하지 않았을 때, else문을 사용할 수 있다.
try :
elem = short_list[index]
print("exception이 발생되면 실행되지 않는 문장")
except Exception as e :
print(f"발생한 exception: {e}")
elem = -1
else :
print("아무 exception도 없었습니다.")
마지막으로 finally는 exception 발생과 상관없이 무조건 실행된다. 주로 사용한 리소스를 close할때 사용된다.
finally :
print("exception 발생 여부와 상관없이 실행되는 문장")