Programming/Python

[Python 3.7] 파이썬 예외 처리 (try, except, else, finally, raise)

Nirsa 2020. 2. 7. 17:16
반응형

 

  • 예외 처리

프로그래밍을 하다보면 여러가지 에러가 발생 합니다. 프로그램이 실행중에 발생하는 에러를 예외라고 부르는데 예외를 무시하고 코드를 실행 시키고 싶을 수 있고, 특정 예외가 발생하면 메세지를 출력한다던가 하는 모션을 취하고 싶을 수 있습니다.

예외처리는 이렇게 실행중에 발생하는 에러(예외)를 여러가지 방법으로 처리할 수 있습니다. 4가지를 간단히 정리한 아래 코드 블럭을 보시면 흐름 자체가 if문과 비슷해 보이기도 합니다.

try:
	예외가 발생할 수 있는 코드
except:
	예외가 발생했을때 실행할 코드
else :
	예외가 발생하지 않았을 때 실행할 코드
finally:
	예외 발생 여부와 상관없이 무조건 실행할 코드

아래에서는 ZeroDivisionError 발생한 경우만 예시로 되어 있으며 이 외에도 AttributeError, NameError, TypeError 등이 있습니다.

 

  • try, except

try는 예외가 발생할 수 있는 코드를 작성하고, except는 예외가 발생 했을 때 실행할 코드 입니다. 아래 코드를 실행하면 0으로는 나눌 수 없기 때문에 "ZeroDivisionError" 에러가 발생 합니다.

def division(a, b):
    x = a / b
    print(x)

# 0으로 나눌 시 예외 발생
division(4, 0)

 

에러가 발생했던 코드의 예외 처리를 try, except를 사용하여 처리하면 아래와 같이 코드가 완성 되는데, 0으로 나눌 경우 "0으로 나누지 마세요"가 출력되며 다른 숫자를 이용해 정상적으로 나눌 경우 재대로된 값이 나옵니다.

## 0으로 나눌 경우
def division(a, b):
    x = a / b
    print(x)

try:
    division(4, 0)
except:
    print('0으로 나누지 마세요')

결과값 : 0으로 나누지 마세요


## 2로 나눌 경우
def division(a, b):
    x = a / b
    print(x)

try:
    division(4, 2)
except:
    print('0으로 나누지 마세요')

결과값 : 2.0

 

0 으로 나눠서 ZeroDivisionError 가 발생할 경우 실행 코드의 흐름은 아래와 같습니다. 만약, 0이 아닌 숫자 2를 사용하면 2번 항목 없이 그대로 print(x)로 내려 가서 나눗셈 결과를 출력 합니다.

또한 except "에러명" as "변수명": 으로 입력하여 발생된 예외를 변수에 담아서 사용할 수 있습니다.

def division(a, b):
    x = a / b
    print(x)

try:
    division(4, 0)
except ZeroDivisionError as e:
    print('0으로 나누지 마세요. {0} 에러가 발생 합니다.'.format(e))

 

  • else, finally, raise

else는 예외가 발생하지 않았을 때 코드를 실행하고, finally는 예외 발생 여부와 상관 없이 코드를 실행 합니다. 아래 코드는 4 / 2가 되므로 예외가 발생하지 않은 예시 입니다.

def division(a, b):
    x = a / b
    print(x)

try:
    division(4, 2)
except ZeroDivisionError as e:
    print('0으로 나누지 마세요. {0} 에러가 발생 합니다.'.format(e))
else:
    print('나눗셈을 정상적으로 실행 되었습니다.')
finally:
    print('프로그램을 종료 합니다.')
    
결과값 : 2.0
결과값 : 나눗셈을 정상적으로 실행 되었습니다.
결과값 : 프로그램을 종료 합니다.

 

아래는 0으로 나눠서 예외가 발생하는 결과값 입니다.

def division(a, b):
    x = a / b
    print(x)

try:
    division(4, 0)
except ZeroDivisionError as e:
    print('0으로 나누지 마세요. {0} 에러가 발생 합니다.'.format(e))
else:
    print('나눗셈을 정상적으로 실행 되었습니다.')
finally:
    print('프로그램을 종료 합니다.')
    
결과값 : 0으로 나누지 마세요. division by zero 에러가 발생 합니다.
결과값 : 프로그램을 종료 합니다.

 

raise는 직접 예외를 발생시켜서 만들어낼 수 있습니다. x / y 의 결과가 1이 아닐 경우 Exception으로 예외를 발생시킵니다.

def division():
    x, y = map(int, input('나눗셈의 결과가 1이될 두 숫자를 입력하세요: ').split())
    result = x / y
    if result != 1:
        raise Exception('나눗셈의 결과가 1이 아닙니다.')
    print(result)

try:
    division()
except Exception as e:
    print('예외 발생:', e)

 

반응형