본문 바로가기
Python

16. 예외 처리(try, exception)

by To올라운더 2023. 7. 5.
반응형

[1] 예외 처리

반복문이나 프로그램을 진행하다보면 예기치 못한 일이 일어날 수 있다.

사용자에 의한 실수로 발생될 수도 있고, 개발자가 처음에 예상치 못해서 생길 수도 있다.

 

이럴 때마다 프로그램이 종료된다면.....

아마 누구도 프로그램을 사용하려 하지 않을 것이다.

 

그래서 실제로는 개발자가 문제가 발생할 요소를 많이 예측하고 예방할수록

수준 높은 프로그램이 만들어지고 수준 높은 개발자가 필요한 이유가 될 것이다.

 

아래와 같이 입력 받은 숫자로 10을 나누고 나머지를 반환하는 반복문을 만들어보겠다.

input 함수는 사용자에게서 원하는 값을 입력 받을 수 있는 함수이며,

유의할 사항은 입력되는 값을 문자형(string)으로 입력 받는다는 것이다.

cnt = 1
while True:
    get_input = input('값을 입력해주세요. 종료를 원하시면 "q"를 입력해주세요.')
    
    print(type(get_input))
    if get_input == 'q':
        break
    
    print(f'{cnt}번째 출력 결과 입니다.')
    print(10 % int(get_input))

 - 우리가 숫자를 입력하거나 종료를 뜻하는 q를 입력할 경우, 정상적인 동작이 반복되는 것을 알 수 있다.

 - 그런데 사용자가 0을 입력하거나, q 외에 다른 문자를 입력하면

   Error의 종류는 다르지만 Error 메세지가 나타나며 프로그램이 강제로 종료된다.

  - 이런 예상되는 일이 나타날 때 무시하거나 다시 입력하도록 유도할 수가 있는데 

    이런 상황에서 try와 except를 사용한다.

 

1. try, except

  - try와 except는 두 가지가 한 세트로 사용된다.

  - try문에 포함된 코드를 실행하다 Error 가 발생하면 except 문을 실해하는 방식이다.

  - except 부분에 특별히 실행할 내용이 없고 다시 반복문을 실행하려면 pass를 입력하면 된다.

cnt = 1
while True:
    get_input = input('값을 입력해주세요. 종료를 원하시면 "q"를 입력해주세요.')
    
    try :
        if get_input == 'q':
            break       
            
        print(f'{cnt}번째 출력 결과 입니다.')
        print(10 % int(get_input))

    except:
        pass

  - 아무런 Error 상황 없이 반복문을 다시 실행하는 것을 볼 수 있다.

  - 하지만 이런 방법은 에러 상황을 인지하지 못하므로 print 문이나 팝업창으로 진행 사항을 알려줄 수도 있다.

cnt = 1
while True:
    get_input = input('값을 입력해주세요. 종료를 원하시면 "q"를 입력해주세요.')
    
    try :
        if get_input == 'q':
            break       
            
        print(f'{cnt}번째 출력 결과 입니다.')
        print(10 % int(get_input))

    except:
        print('예기치 못한 Error가 발생하였습니다. 다시 입력해주세요.')

 - 뭔가 더 정리된듯한 모습이지만, 실제 무슨 Error가 발생했는지 알기는 어렵다.

 - 그래서 2가지 방법으로 처리할 수 있는데, 한가지는 해당 Error의 유형이나 타입에 대해서 출력을 하는 방법이고,

   두번째는 확인되는 해당 유형에 따라 맞춤 요청사항을 출력하는 방법이다.

 

  1) except Exception

     - 12,13라인을 보면 Error 가 발생하는 상황에 대한 결과를 err 이라는 변수에 담아 출력할 수 있고,

       그 결과 0을 입력하거나 다른 문자가 입력되었을 때에 대한 Error 메세지를 확인할 수 있다.

cnt = 1
while True:
    get_input = input('값을 입력해주세요. 종료를 원하시면 "q"를 입력해주세요.')
    
    try :
        if get_input == 'q':
            break       
            
        print(f'{cnt}번째 출력 결과 입니다.')
        print(10 % int(get_input))

    except Exception as err:
        print(err)

  - 이제 이 Error를 바탕으로 Error 유형별 처리를 해보겠다.

 

  2)  Error 유형별 처리하기

  - 처음 except 없이 0과 a 로 실행을 했을 때 나타난 Error 메세지를 보면 

    각각 ZeroDivisionError, ValueError 를 확인할 수 있다.

  - 해당 Error 를 입력하여 별도의 출력문을 만들면, 0으로 실행했을 때는 12,13 라인에서 작성된 코드를 따라 결과가 실행되고, 아직 지정하지 않은 문자 입력의 경우 16,17라인의 전체 Error에 대한 코드를 진행하는 것을 알 수 있다.

cnt = 1
while True:
    get_input = input('값을 입력해주세요. 종료를 원하시면 "q"를 입력해주세요.')
    
    try :
        if get_input == 'q':
            break       
            
        print(f'{cnt}번째 출력 결과 입니다.')
        print(10 % int(get_input))

    except ZeroDivisionError:
        print('0으로 나눌 수는 없습니다. 값을 다시 입력해주세요.')


    except Exception as err:
        print(err)

 

2. finally

  - finally는 try, except 문을 실행 후 출력되는 구문인데, finally의 사용 유무에 따른 결과를 보면 쉽게 이해할 수 있다.

  1) finally 없이 print문 사용 시

cnt = 1
while True:
    get_input = input('값을 입력해주세요. 종료를 원하시면 "q"를 입력해주세요.')
    
    try :
        if get_input == 'q':
            break       
            
        print(f'{cnt}번째 출력 결과 입니다.')
        print(10 % int(get_input))

    except ZeroDivisionError:
        print('0으로 나눌 수는 없습니다. 값을 다시 입력해주세요.')


    except Exception as err:
        print(err)

    #finally: 
    print('다음 동작을 기다립니다. \n')

  - 우리가 예상하는 대로 try, except 문을 실행한 뒤 print문을 실행한다. 따라서 break 가 진행된 문자 q가 입력되면 try문을 종료하고 아래에 있는 print문은 실행되지 않는다.

  - 그런데 finally를 추가하면 결과가 달라지는데

cnt = 1
while True:
    get_input = input('값을 입력해주세요. 종료를 원하시면 "q"를 입력해주세요.')
    
    try :
        if get_input == 'q':
            break       
            
        print(f'{cnt}번째 출력 결과 입니다.')
        print(10 % int(get_input))

    except ZeroDivisionError:
        print('0으로 나눌 수는 없습니다. 값을 다시 입력해주세요.')


    except Exception as err:
        print(err)

    finally: 
        print('다음 동작을 기다립니다. \n')

  - q 입력 후, break가 발생했음에도 try 문을 종료하며 finally 문을 실행했다는 것을 알 수 있다.

  - 동일하게 except 문에서 break를 진행해도 동일하게 finally문이 출력된다.

cnt = 1
while True:
    get_input = input('값을 입력해주세요. 종료를 원하시면 "q"를 입력해주세요.')
    
    try :
        if get_input == 'q':
            break       
            
        print(f'{cnt}번째 출력 결과 입니다.')
        print(10 % int(get_input))

    except ZeroDivisionError:
        print('0으로 나눌 수는 없습니다. 값을 다시 입력해주세요.')


    except Exception as err:
        #print(err)
        print('예기치 않은 에러로 프로그램을 종료합니다.')
        break

    finally: 
        print('다음 동작을 기다립니다. \n')

 

반응형

'Python' 카테고리의 다른 글

18. 파이썬 클래스2(class)  (0) 2023.07.11
17. 파이썬 클래스1(class)  (1) 2023.07.10
15. 파이썬 함수  (0) 2023.07.04
14. 파이썬 반복문(while)  (0) 2023.07.03
13. 파이썬 반복문(for)  (0) 2023.07.01