Exceptions은 예외라는 뜻이며,
파이썬에서 예외는 의도하지 않은 에러가 일어나는 경우이다.
List를 예로 들자면
short_list = [1, 2, 3]
print(short_list[3])
>>>IndexError: list index out of range
만일 파이썬에서 index가 0부터 시작한다는 것이 익숙지 않으면 충분히 생길 수 있는 exception이다.
🚨 Exception이 발생하면, 발생한 코드 위치에서 다음 코드들이 실행되지 않고 곧바로 프로그램이 종료를 하게 된다.
exception handling
하지만 exception이 발생해도 해당 프로세스가 종료되지 않고 대신에 다른 로직을 실행하게 한 후 프로그램을 계속 실행하게 할 수 있다.
예를 들어, 잘못된 값을 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처럼 특정한 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
return_elem_or_minus_one("a")
>>>
IndexError가 아닌 다른 종류의 Exception이 발생했습니다
이 문장은 exception 발생 여부와 상관없이 무조건 실행됩니다!
또한 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
return_elem_or_minus_one("a")
>>>
IndexError가 아닌 다른 종류의 Exception이 발생했습니다 ==> list indices must be integers or slices, not str
이 문장은 exception 발생 여부와 상관없이 무조건 실행됩니다!
마지막으로 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
return_elem_or_minus_one(2)
>>>
이 문장은 exception이 발생하지 않으면 실행됩니다
Exception이 발생하지 않았습니다!
이 문장은 exception 발생 여부와 상관없이 무조건 실행됩니다!
문제)
divison
함수를 수정하여서 exception이 발생하는 경우 -1을 return 하도록 해주세요.
def division(num1, num2):
return num1 / num2
수정한 코드)
def division(num1, num2):
try:
return num1 / num2
except Exception:
return -1
finally만 쓰면❓
def division(num1, num2):
try:
return num1 / num2
finally:
return -1
print(division(8,4))
>>> -1
#exception 발생 여부와 상관없이 무조건 실행되기에 -1이 리턴 된다.