View
58. Exceptions
58-1. Exceptions
Exception이란 영어 단어는 한국어로 예외라는 뜻입니다.
그렇다면 파이썬에서 "예외" 상황은 언제를 이야기 하는 걸까요?
당연히 의도하지 않은 에러가 일어나는 경우를 예외 상황 이라고 합니다.
그리고 이러한 예외 상황이 일어나는 경우를 일반적으로 exception이 일어났다고 합니다.
Exception은 의외로 생각보다 자주 일어날 수 있습니다.
다음과 같은 list로 예를 들어 보겠습니다.
short_list = [1, 2, 3]
총 요소의 수가 3개인 list 입니다. 하지만 만일 실수로 4번째 요소를 indexing 하게 되면 IndexError 가 나게됩니다.
fourth_element = short_list[3]
>
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
IndexError: list index out of range
만일 파이썬에서 index가 0부터 시작한다는것이 익숙치 않으면 충분히 생길 수 있는 exception 입니다.
물론 처음부터 이러한 exception이 발생하지 않도록 코드를 구현하는 것이 가장 좋겠습니다만, 현실적으로 항상 가능한것은 아닙니다. 특히, 유저의 input을 기반으로 어떠한 연산을 하게 될때 exception이 발생될 가능성이 높습니다. 왜냐하면 유저가 어떠한 형태의 data를 input으로 입력할지 항상 알 수 없기 때문입니다.
Exception이 발생하면, 발생한 코드 위치에서 다음 코드들이 실행되지 않고 곧바로 프로그램이 종료를 하게 됩니다.
하지만 exception이 발생해도 해당 프로세스가 종료하지 않고 대신에 다른 로직을 실행하게 한 후 프로그램을 계속 실행하게 할 수 있습니다. 이러한 것을 exception handling이라고 합니다.
예를 들어, user가 잘못된 값을 input으로 입력해서 exception이 일어났다고 해도, 종료하지 말고 유저에게 메세지를 리턴하도록 할 수 있는 것입니다. Exception handling은 try ... except ... 구문을 사용해서 실행합니다.
try:
문장1
문장2
...
문장N
except Exception:
exception이 났을 경우 실행할 예외 처리코드
finally:
Exception 여부와 상관없이 항상 마지막에 실행되는 코드
예를 들어, 앞서 보았단 코드 예제의 경우 만일 IndexError가 났을 경우 프로그램을 종료하는 대신 에러 메세지를 출력하고 -1을 리턴하기 위해서는 다음처럼할 수 있습니다.
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 블락에서는 여러 exception을 catch 할 수 있습니다.
앞서 본 코드 처럼 IndexError 처럼 specific한 exception을 catch 할 수 도 있고 다른 모든 exception들을 catch 할 수 있습니다.
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
또한 Exception을 catch할때 as 문을 써서 해당 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
finally:
print("이 문장은 exception 발생 여부와 상관없이 무조건 실행됩니다!")
return elem
마지막으로 try 문에서도 else를 사용할 수 있습니다.
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
Assignment
왼쪽 상단의 divison 함수를 수정하여서 exception이 발생하는 경우 -1을 return 하도록 해주세요.
def division(num1, num2):
try:
result = num1 / num2
except Exception:
result = -1
return result
'PYTHON' 카테고리의 다른 글
TIL 40 | PYTHON_Django_ManyToManyField의 역할 (0) | 2021.08.18 |
---|---|
TIL 27 | PYTHON_How import statement finds modules and packages (0) | 2021.08.10 |
TIL 25 |PYTHON_For Loops (0) | 2021.08.10 |
TIL 23 | Session_스타벅스_모델링 (0) | 2021.08.10 |
TIL 21 | PYTHON_Set 과 Dictionary_List 와 Tuple 의 차이 (0) | 2021.08.09 |