파이썬의 오류처리 방식

 오늘은 파이썬의 오류처리구문 (Try...) 에 대해 살펴보고자 합니다. 

프로그래밍을 하다보면 다양한 오류들을 만나게되는데, 이때 적절한 오류처리구문이 없다면 런타임 (실행시간) 오류로 이어지게 되고 이는 소프트웨어의 결함이라 볼 수 있습니다.

특히 상업적인 목적의 코드라면 절대 런타임 오류는 피해야 하겠죠.

[이미지 출처 : Pixabay, mohamed hassan]

정상적인 형변환의 경우

예를 들면 두 수를 입력받아 사칙연산을 수행하는 코드를 아래와 같이 작성하고,

x = int( input('Input number:') )
y = int( input('Input number:') )

print(x, '+', y, '=', x + y)
print(x, '-', y, '=', x - y)
print(x, '*', y, '=', x * y)
print(x, '/', y, '=', x / y)

아래와 같이 숫자를 정상적으로 입력하면 결과는 다음과 같습니다.

Input number:5
Input number:2
5 + 2 = 7
5 - 2 = 3
5 * 2 = 10
5 / 2 = 2.5

 

문자를 숫자로 형변환 하는 경우

그런데 여기서 숫자가 아닌 문자를 입력하면 어떻게 될까요?

예를 들면 다음과 "오" 라는 문자를 말이죠.

Input number:오
Traceback (most recent call last):
  File "C:/Users/jwkim/Documents/PyCharm_Project/test/main.py", line 2, in <module>
    x = int( input('Input number:') )
ValueError: invalid literal for int() with base 10: '오'

결과는 유효하지 않은 리터럴 이라고 오류가 발생하게 됩니다.

 

조금만 생각해 보면 당연한 결과 입니다.

아래의 코드에서

x = int( input('Input number:') )

다음과 같이 입력한 형태이므로 문자를 숫자로 형변환 (Type Conversion) 하며 오류가 발생합니다.

x = int( '오' )


오류처리

사용자는 실수로 숫자가 아닌 문자를 입력할 수 있으므로 아래와 같이 처리합니다

def inputNumber(s):
    while True:
        try:
            n = int( input(s) )
        except Exception as e:
            print(e)
            continue
        else:
            return n

x = inputNumber('Input Number:')
y = inputNumber('Input Number:')

print(x, '+', y, '=', x + y)
print(x, '-', y, '=', x - y)
print(x, '*', y, '=', x * y)
print(x, '/', y, '=', x / y)

InputNumber() 라는 함수를 하나 만들고 숫자를 입력받아 리턴하도록 구성합니다.

파이썬의 오류처리는 try, except, else, finally 절의 조합으로 이루어 집니다.

 

  • try : 오류가 발생할 소지가 있는 코드를 시도

  • except : try 중 오류가 발생된 경우 진입 (생략, 반복 가능)

  • else : try 중 문제가 발생되지 않은 경우 진입 (생략가능)

  • finally : try 중 문제발생여부와 상관없이 무조건 진입 (생략가능)


위의 코드에서 문자가 입력되면 except 절로 들어가게 되며 아래 동작을 수행합니다.

1. except 절의 오류 객체 e를 받아와 오류내용을 출력.

2. continue 구문을 통해 반복문의 처음으로 이동. (계속해서 입력이 가능하도록)

즉 아래와 같이 동작하게 됩니다.

Input Number:오
invalid literal for int() with base 10: '오'
Input Number:5
Input Number:4
5 + 4 = 9
5 - 4 = 1
5 * 4 = 20
5 / 4 = 1.25

위 결과에서 "오"라는 문자를 입력한 경우 except 절로 빠져 오류를 출력하고 다시 반복문의 처음으로 돌아가 재 입력을 요구하는 모습을 확인할 수 있습니다. 

만약 문제가 없었다면 else 절로 빠져 입력받은 숫자를 정상 리턴하며 무한루프는 종료됩니다.

보통 잘못된 입력을 오류처리하는 경우, 입력값에 오류가 있다면 뒤에 진행할 공정의 수행이 불가능하므로 무한루프로 정상입력이 들어올때까지 처리하는 것이 일반적입니다.

감사합니다.

댓글

이 블로그의 인기 게시물

Qt Designer 설치하기

PyQt5 기반 동영상 플레이어앱 만들기