예외(exception)란 코드를 실행하는 중에 발생한 에러를 뜻합니다.
예1)
def ten_div(x):
return 10/x
위 함수에 2를 넣을 경우
>>> ten_div(2)
5.0
하지만 , 0을 넣을 경우 실행 중 에러가 발생한다.
이런 상황을 예외라고 하는데 여기서는 어떤 숫자를 0으로 나누어서 ZeroDivisionError 예외가 발생했다.
>>> ten_div(0)
Traceback (most recent call last):
File "<pyshell#121>", line 1, in <module>
ten_div(0)
File "<pyshell#119>", line 2, in ten_div
return 10 / x
ZeroDivisionError: division by zero
이번에는 예외가 발생했을 때도 스크립트 실행을 중단하지 않고 계속 실행하게 해주는 예외 처리 방법에 대해 알아보겠다.
예외 처리를 하려면 다음과 같이 try에 실행할 코드를 넣고 except에 예외가 발생했을 떄 처리하는 코드를 넣습니다.
try:
실행할 코드
except:
예외가 발생했을때 처리하는 코드
예2)
try:
x = int(input('나눌 숫자를 입력하세요: ))
y = 10/x
print(y)
except:
print('예외가 발생하였습니다.')
위 소스코드를 실행한 뒤 0을 입력하면 ,
나눌 숫자를 입력하세요: 0 (입력)
예외가 발생했습니다.
위 상황처럼 결과가 나오게 된다.
이번에는 except에 예외. 이름을 지정해서 특정 예외가 발생했을 때만 처리코드를 실행하도록 만들어보자.
try:
실행할 코드
except 예외이름:
예외가 발생했을 때 처리하는 코드
예 3)
y = [10, 20, 30]
try:
index, x = map(int, input('인덱스와 나눌 숫자를 입력하세요: ').split())
print(y[index] / x)
except ZeroDivisionError: # 숫자를 0으로 나눠서 에러가 발생했을 때 실행됨
print('숫자를 0으로 나눌 수 없습니다.')
except IndexError: # 범위를 벗어난 인덱스에 접근하여 에러가 발생했을 때 실행됨
print('잘못된 인덱스입니다.')
상황 1 )
인덱스와 나눌 숫자를 입력하세요: 2 0 (입력)
숫자를 0으로 나눌 수 없습니다.
2 0을 입력하게 되면 30/0이 되므로 숫자를 0으로 나누게 된다. 이때는 except ZeroDivisionError:의 처리 코드가 실행된다.
상황 2 )
인덱스와 나눌 숫자를 입력하세요: 3 5 (입력)
잘못된 인덱스입니다.
그럼 결과가 ,
인덱스와 나눌 숫자를 입력하세요: 3 5 (입력)
잘못된 인덱스입니다.
이렇게 나오게 된다. 이유는 y에는 3개의 요소가 들어있는 리스트이다 . 따라서 인덱스 3을 넘어가면 예외처리 코드가 실행된다.
except에서 as 뒤에 변수를 지정하면 발생한 예외의 에러 메세지를 받아올 수 있다.
try:
실행할 코드
except 예외 as 변수:
예외가 발생했을 때 처리하는 코드
위 코드의 except에 as e를 넣어보자 . 보통 예외(exception)의 e를 따서 변수이름을 e로 짓는다.
예 4)
y = [10, 20, 30]
try:
index, x = map(int, input('인덱스와 나눌 숫자를 입력하세요: ').split())
print(y[index] / x)
except ZeroDivisionError as e: # as 뒤에 변수를 지정하면 에러를 받아옴
print('숫자를 0으로 나눌 수 없습니다.', e) # e에 저장된 에러 메시지 출력
except IndexError as e:
print('잘못된 인덱스입니다.', e)
상황 3)
인덱스와 나눌 숫자를 입력하세요: 2 0 (입력)
숫자를 0으로 나눌 수 없습니다. division by zero
상황 4)
인덱스와 나눌 숫자를 입력하세요: 3 5 (입력)
잘못된 인덱스입니다. list index out of range
이렇게 해당 예외에 해당하는 에러 메시지가 출력된다.
단 , 예외가 여러 개 발생하더라도 먼저 발생한 예외의 처리 코드만 실행된다.
참고로 ,
모든 예외의 에러 메시지를 출력하고 싶다면 다음과 같이 except에 Exception을 지정하고 as 뒤에 변수를 넣으면 된다.
except Exception as e: # 모든 예외의 에러 메시지를 출력할 때는 Exception을 사용
print('예외가 발생했습니다.', e)
이처럼 예외 처리는 에러가 발생하더라도 스크립트의 실행을 중단시키지 않고 계속 실행하고자 할 때 사용합니다.
전체 계층도는 파이썬 공식 문서를 참조하세요.
Built-in Exceptions: https://docs.python.org/3/library/exceptions.html#exception-hierarchy
이상으로 Python - 예외 처리하기를 마무리하도록 하겠습니다.
더 나은 개발이 되길 바라며:)