[Python] 파이썬 예외 처리

예외 처리는 에러가 발생하더라도 스크립트의 실행을 중단시키지 않고 계속 실행하고자 할 때 사용합니다.

 

1. Try Except 구문 사용하기

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

 

 

예시

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

 

x에 0을 입력하면 10/0이 되어 오류가 발생하지만, 여기서는 except를 사용하여 해당 오류를 처리

 

특정 예외만 처리하기

y = [10, 20, 30]
 
try:
    index, x = map(int, input('인덱스와 나눌 숫자를 입력하세요: ').split())
    print(y[index] / x)
    
except ZeroDivisionError:    # 숫자를 0으로 나눠서 에러가 발생했을 때 실행됨
    print('숫자를 0으로 나눌 수 없습니다.')
    
except IndexError:           # 범위를 벗어난 인덱스에 접근하여 에러가 발생했을 때 실행됨
    print('잘못된 인덱스입니다.')

 

예외의 에러 메시지 받아오기

except에서 as 뒤에 변수를 지정하면 발생한 예외의 에러 메시지를 받아올 수 있다.

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)

 

모든 예외의 에러 메시지를 출력할 때는 Exception을 사용

except Exception as e:   
    print('예외가 발생했습니다.', e)

 

참고 : 파이썬 예외 계층 https://docs.python.org/3/library/exceptions.html#exception-hierarchy

 

 

 

 

2.  else와 finally 사용하기

else 는 예외가 발생하지 않았을 때 코드를 실행

else except 바로 다음에 와야 하며 except를 생략할 수 없다.

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

 

예시

try:
    x = int(input('나눌 숫자를 입력하세요: '))
    y = 10 / x
except ZeroDivisionError:    # 숫자를 0으로 나눠서 에러가 발생했을 때 실행됨
    print('숫자를 0으로 나눌 수 없습니다.')
else:                        # try의 코드에서 예외가 발생하지 않았을 때 실행됨
    print(y)

 

finally는 예외와는 상관없이 항상 코드 실행

try:
    실행할 코드
except:
    예외가 발생했을 때 처리하는 코드
else:
    예외가 발생하지 않았을 때 실행할 코드
finally:
    예외 발생 여부와 상관없이 항상 실행할 코드

 

예시

try:
    x = int(input('나눌 숫자를 입력하세요: '))
    y = 10 / x
except ZeroDivisionError:    # 숫자를 0으로 나눠서 에러가 발생했을 때 실행됨
    print('숫자를 0으로 나눌 수 없습니다.')
else:                        # try의 코드에서 예외가 발생하지 않았을 때 실행됨
    print(y)
finally:                     # 예외 발생 여부와 상관없이 항상 실행됨
    print('코드 실행이 끝났습니다.')

 

3. 예외 발생시키기

raise를 사용해 오류를 강제로 발생시킬 수 있다.

try:
    x = int(input('3의 배수를 입력하세요: '))
    if x % 3 != 0:                                 # x가 3의 배수가 아니면
        raise Exception('3의 배수가 아닙니다.')    # 예외를 발생시킴
    print(x)
except Exception as e:                             # 예외가 발생했을 때 실행됨
    print('예외가 발생했습니다.', e)

 

 raise로 예외를 발생시키면 raise 아래에 있는 코드는 실행되지 않고 바로 except로 넘어갑니다. 따라서 try print(x)는 실행되지 않습니다.

 

 

 

4. 예외 만들기

많은 경우에 특정 예외를 처리하기 위하여 예외를 직접 만들어 사용하기도 한다.

예외는 파이썬 내장 클래스인 Exception 클래스를 상속하여 만들 수 있다.

class 예외이름(Exception):
    def __init__(self):
        super().__init__('에러메시지')

 

raise를 이용하여 사용자 정의 예외를 발생시킬 수 있다.

raise NotThreeMultipleError('3의 배수가 아닙니다.')    # 예외를 발생시킬 때 에러 메시지를 넣음

 

 

댓글

Designed by JB FACTORY