short_list = [1, 2, 3]
총 요소의 수가 3개인 list 이다.
하지만 만일 실수로 4번째 요소를 indexing 하게 되면 IndexError 가 난다.
fourth_element = short_list[3] IndexError Traceback (most recent call last) <ipython-input-2-54d383a36828> in <module>()
이렇게 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
Exception은 이와 같이 index error와 모든 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
또한 Exception을 확인할때 "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을 리턴하도록 해주세요.
def division(num1, num2): result = 0 try: result = num1/num2 print("예외가 없을 때 실행됩니다") except IndexError: print(f"IndexError입니다") result = -1 except Exception: print(f"예외가 발생했습니다") result = -1 finally: print("이 문장은 exception 발생 여부와 상관없이 무조건 실행됩니다!") return result