의도치 않은 에러가 발생하는 경우를 예외 상황이라고 한다.
아래 예시를 살펴보자
short_list = [1, 2, 3]
fourth_element = short_list[3]
>
IndexError Traceback (most recent call last)
<ipython-input-2-54d383a36828> in <module>()
파이썬의 인덱스가 0으로부터 시작한다는 점을 깜박했으면 위와 같은 에러를 볼 수 있을 것이다.
파이썬에서는 에러가 발생할 경우 바로 프로그램이 종료되게 되있는데, 프로그램의 input 값으로 항상 올바른 값만 넣을 수는 없다는 점을 고려하면 에러가 발생하더라도 프로그램이 계속 실행되도록 하는 것이 더 현실적일 것이다.
에러 상황에 조치할 수 있도록 파이썬에서는 try와 except, finally 기능을 제공한다.
try:
문장1
문장2
...
문장N
except Exception:
exception이 났을 경우 실행할 예외 처리코드
finally:
Exception 여부와 상관없이 항상 마지막에 실행되는 코드
아래 예시를 통해 더욱 자세히 알아보자
def return_elem_or_minus_one(index):
short_list = [1, 2, 3]
elem = 0
try:
elem = short_list[index]
print("이 문장은 exception이 발생되면 실행되지 않습니다!")
except IndexError:
print(f"이 문장은 Exception이 발생하면 실행 됩니다")
elem = -1
finally:
print("이 문장은 exception 발생 여부와 상관없이 무조건 실행됩니다!")
return elem
return_elem_or_minus_one(1)
> 이 문장은 exception이 발생되면 실행되지 않습니다!
이 문장은 exception 발생 여부와 상관없이 무조건 실행됩니다!
2
return_elem_or_minus_one(4)
> 이 문장은 Exception이 발생하면 실행 됩니다
이 문장은 exception 발생 여부와 상관없이 무조건 실행됩니다!
-1
문장이 에러 없이 실행된다면 try 구문의 문구가 출력되고, IndexError가 발생하면 except 구문이 실행되는 것을 알 수 있다. 또한 finally 구문은 에러와는 상관없이 실행되는 것을 확인할 수 있다.
except 구문은 여러 에러를 캐치할 수도 있다. 또한 아래와 같이 except 뒤에 Exception을 입력하면 모든 종류의 에러 발생시 실행될 코드를 정의할 수도 있다.
def return_elem_or_minus_one(index):
short_list = [1, 2, 3]
elem = 0
try:
elem = short_list[index]
print("이 문장은 exception이 발생되면 실행되지 않습니다!")
except IndexError:
print(f"이 문장은 Exception이 발생하면 실행 됩니다")
elem = -1
except Exception:
print(f"IndexError가 아닌 다른 종류의 Exception이 발생했습니다")
elem = -1
finally:
print("이 문장은 exception 발생 여부와 상관없이 무조건 실행됩니다!")
return elem
아래와 같이 else를 사용해서 exception이 발생하지 않았을때 실행될 코드를 설정할 수도 있다.
def return_elem_or_minus_one(index):
short_list = [1, 2, 3]
elem = 0
try:
elem = short_list[index]
print("이 문장은 exception이 발생하지 않으면 실행됩니다")
except IndexError:
print(f"이 문장은 Exception이 발생하면 실행 됩니다")
elem = -1
except Exception as e:
print(f"IndexError가 아닌 다른 종류의 Exception이 발생했습니다 ==> {e}")
elem = -1
else:
print(f"Exception이 발생하지 않았습니다!")
finally:
print("이 문장은 exception 발생 여부와 상관없이 무조건 실행됩니다!")
return elem