Python - 예외 처리 사용하기

심준보·2023년 1월 16일
0

Python

목록 보기
2/6

Python - 예외 처리 사용하기

예외(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에 예외가 발생했을 떄 처리하는 코드를 넣습니다.

try:
	실행할 코드 
    
except:
	예외가 발생했을때 처리하는 코드

예2)

try:
	x = int(input('나눌 숫자를 입력하세요: ))
    y = 10/x
    print(y)
    
 except:
 	print('예외가 발생하였습니다.')
    

위 소스코드를 실행한 뒤 0을 입력하면 ,

나눌 숫자를 입력하세요: 0 (입력)
예외가 발생했습니다.

위 상황처럼 결과가 나오게 된다.

특정 예외만 처리하기

이번에는 except에 예외. 이름을 지정해서 특정 예외가 발생했을 때만 처리코드를 실행하도록 만들어보자.

try:
    실행할 코드
except 예외이름:
    예외가 발생했을 때 처리하는 코드

예 3)

  • 정수를 2개를 입력받아서 하나는 리스트의 인덱스로 사용하고 , 하나는 나누는 값으로 사용한다. 그리고 except를 두개 사용하고 가각 ZeroDivisionError와 IndexError로 지정한다.
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을 입력해보자
인덱스와 나눌 숫자를 입력하세요: 2 0 (입력)
숫자를 0으로 나눌 수 없습니다.

2 0을 입력하게 되면 30/0이 되므로 숫자를 0으로 나누게 된다. 이때는 except ZeroDivisionError:의 처리 코드가 실행된다.

상황 2 )

  • 이번엔 소스 코드에 3 5를 입력해보자
인덱스와 나눌 숫자를 입력하세요: 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 - 예외 처리하기를 마무리하도록 하겠습니다.




더 나은 개발이 되길 바라며:)

profile
밑거름이라고생각합니다

0개의 댓글