2011년 11월 11일 금요일

15 예외 처리법

숫자만 입력해야 하는데 숫자가 아닌 문자를 입력하면 프로그램이 비정상적으로 종료합니다(에러가 발생한 것입니다). 또 그냥 엔터를 칠 경우도 비정상적으로 프로그램이 종료합니다. 나누기 계산을 할 때 두번째 숫자가 0이면 에러가 납니다.

에러가 발생하면, 보통에러의 내용을 'Traceback이라는 문구로 시작하여 쭉 보여 줍니다. 대체로 마지막 줄에 어떤 에러인지 알려줍니다. 다음은 숫자를 입력해야 하는데, 숫자가 아닌 문자를 입력했을 때 알려주는 Traceback 문장입니다.

피트(ft) : x
Traceback (most recent call last):
  File "/home/Python/Practice/07measures.py", line 39, in <module>
    myMulti('피트(ft) : ', 30.48, '센티미터')
  File "/home/Python/Practice/07measures.py", line 15, in myMulti
    efface = float(input(vindication))
ValueError: could not convert string to float: 'x'
>>>

위의 경우, ValueError가 발생한 것입니다. 이러한 에러가 발생할 때 프로그램을 비정상적으로 종료하지 않게 하려면, try 구문을 사용해야 합니다. try 항목에 우선 실행할 명령을 입력합니다. 명령이 실행되는 과정에 에러가 발생할 것 같으면(숫자를 입력하지 않을 경우), except 항목에 해당 에러 문구(위에서는 ValueError)에 대해 예외처리를 해 줍니다. 예를 들면 안내문을 표시해 주고 프로그램을 다시 앞단계에서 실행되도록 해 줍니다. 숫자를 제대로 잘 입력한 경우는 else 항목의 명령을 실행합니다.  다음은 이에 대한 간단한 예제입니다.


print('계산 프로그램')
print('다음 메뉴 중 원하는 번호를 입력해 주세요.')
print('1. 곱하기   2. 나누기  3. 프로그램 종료')
def iMulti(a, b) :
    try :
        aa = float(input(a))
        bb = float(input(b))
    except ValueError :
        print('숫자만 입력하셔야 합니다용~')
    else :       
        c = round(aa * bb, 1)
        print('답 :', c)
def iDiv(a, b) :
    try :
        aa = float(input(a))
        bb = float(input(b))
    except ValueError :
        print('숫자만 입력하셔야 합니다용~')
    else :
        try :
            c = round(aa / bb, 1)
        except ZeroDivisionError :
            print('두번째로 입력한 숫자가 0이면 안됩니다용~')
        else :
            print('답 :', c)
g = '0'
while g != '3' :
    g = input('\n' + '메뉴 번호를 입력해 주세요 : ')
    if g == '3' :
        print('프로그램을 종료합니다.')
    else :
        if g == '1' :
            iMulti('제발 숫자만 입력해 주세요^^ : ','제발 숫자만 입력해 주세요^^ : ')
        elif g == '2' :
            iDiv('제발 숫자만 입력해 주세요^^ : ','제발 숫자만 입력해 주세요^^ : ')
        else :
            print('종료하고 싶으면 숫자 3을 입력해 주세요~')
print('이용해 주셔서 감사합니다.')

이 프로그램을 실행하고 다양한 테스트를 한 화면은 다음과 같습니다.

>>>
계산 프로그램
다음 메뉴 중 원하는 번호를 입력해 주세요.

1. 곱하기   2. 나누기  3. 프로그램 종료

메뉴 번호를 입력해 주세요 : 2
제발 숫자만 입력해 주세요^^ : 3
제발 숫자만 입력해 주세요^^ : 0
두번째로 입력한 숫자가 0이면 안됩니다용~

메뉴 번호를 입력해 주세요 : 2
제발 숫자만 입력해 주세요^^ :
숫자만 입력하셔야 합니다용~

메뉴 번호를 입력해 주세요 : 2
제발 숫자만 입력해 주세요^^ : z
숫자만 입력하셔야 합니다용~

메뉴 번호를 입력해 주세요 : 1
제발 숫자만 입력해 주세요^^ : 2
제발 숫자만 입력해 주세요^^ : 1
답 : 2.0

메뉴 번호를 입력해 주세요 : 1
제발 숫자만 입력해 주세요^^ : 1.1
제발 숫자만 입력해 주세요^^ : 2.3
답 : 2.5

메뉴 번호를 입력해 주세요 : 1
제발 숫자만 입력해 주세요^^ :
숫자만 입력하셔야 합니다용~

메뉴 번호를 입력해 주세요 : 1
제발 숫자만 입력해 주세요^^ : z
숫자만 입력하셔야 합니다용~

메뉴 번호를 입력해 주세요 : x
종료하고 싶으면 숫자 3을 입력해 주세요~

메뉴 번호를 입력해 주세요 : 3
프로그램을 종료합니다.
이용해 주셔서 감사합니다.
>>>


댓글 없음:

댓글 쓰기