본문 바로가기
Python/Python Basic

21. Python - 코드 예외 처리(try, except, else, finally 문)

by Rosmary 2020. 5. 22.
728x90
반응형

Python의 기본적인 사용을 위해 알아야 할 그 마지막. 코드 예외처리에 대해 포스팅하려고 한다.

 

지금까지 기본적인 Python 코드에 대해 학습하면서, 어떤 분들은 스스로 자그만한 프로그램이라도 한 두 개씩은 만들어 보았을 것이다. 그리고 이 프로그램들을 스스로 제작하면서 적어도 100개 이상의 코드 에러를 경험했을 것이다(그렇지 않다면 프로그래밍에 두각을 나타내는 천재거나 연습을 안했다던가 두 가지 중 하나다).

 

 

 

물론, 이런 에러가 프로그래머의 실수로 인해 나타나는 경우가 대부분이지만, 프로그램머가 의도하지 않았음에도 필연적으로 이런 오류를 맞닥들이는 상황이 발생한다. 예를 들면 아래와 같은 경우다.

 

--------------------------------------------------------------------------

print("두 숫자의 합을 구합니다. 두 개의 숫자를 입력해주세요")

a = int(input("Num1: "))

b = int(input("Num2: "))

print("{}와 {}의 합: {}".format(a, b, a + b))

--------------------------------------------------------------------------

 

이 코드를 메모장에 test.py라는 이름으로 저장하고, cmd에서 실행시켜보겠다.

 

 

이 프로그램을 사용하는 사용자가, 프로그램이 의도한대로 숫자만 입력한다면, 프로그램은 문제없이 두 숫자의 합을 출력하고 종료될 것이다. 하지만, 만약 사용자가 실수로 숫자가 아닌 문자를 입력한다면, 컴퓨터는 입력된 문자를 숫자로 변환할 수 없기 때문에, 아래와 같은 에러를 출력할 것이다.

 

 

사용자는 컴퓨터가 아니기 때문에, 입력하는 과정에서 위와 같은 실수는 반드시 나오게 되어 있다. 그렇기 때문에, 사용자의 이러한 실수도 언제든지 발생할 수 있음을 컴퓨터에게도 알려주는 작업이 필요하다. 즉, "컴퓨터야! 분명 사용자들이 실수로 이러한 에러를 낼 것이니, 혹시라도 이런 에러가 발생하면 프로그램 강제로 종료시키지 말고 이러이러한 동작을 진행해 줘!" 라고 명령하는 것이라고 보면 된다. 이를 (오류)예외 처리라고 한다.

 

예외 처리에 사용되는 키워드는 try, except, else 그리고 finally 네 가지가 있다. 사용 방법은 if~else 문과 매우 유사하다. 하나씩 알아보도록 하자.

 

1. try 문

 

try 문은 오류가 일어날만한 부분에 사용하는 키워드다. 위의 코드를 예로 들자면, 에러가 일어날 수 있는 부분은 사용자가 실수로 숫자 대신 문자를 입력하는 2~3번째 줄이 될 것이다. 이 부분을 try: 키워드 아래로 넣어줌으로써, 컴퓨터에게 이 부분에서 에러가 발생할 수 있음을 인지시키는 것이라 보면 된다. 위에서 작성한 코드를 아래와 같이 변경시켜보자.

 

--------------------------------------------------------------------------

print("두 숫자의 합을 구합니다. 두 개의 숫자를 입력해주세요")

 

try:

    a = int(input("Num1: "))

    b = int(input("Num2: "))

 

print("{}와 {}의 합: {}".format(a, b, a + b))

--------------------------------------------------------------------------

 

try 문 역시, if나 else 또는 while 등과 같이, 키워드 뒤에 콜론(:)을 찍고 들여쓰기를 함으로써 작성하면 된다. 위에서도 언급했지만, try: 문 하위로 들어가는 코드는 에러가 발생할 수 있는 코드를 넣어주면 된다. 하지만 이것이 끝이 아니다. 이 상태로 test.py를 실행하면 오류가 발생하게 된다. 왜냐하면, 컴퓨터는 try:문 아래의 코드에서 오류가 발생할 가능성이 있음은 알고 있지만, 어떤 오류가 발생할지는 알지 못하고, 설령 오류가 나더라도 어떤 작업을 해야하는지 전혀 전달받은 것이 없기 때문이다. 

 

그럼 컴퓨터가, try:문 아래의 코드에서 어떤 에러가 발생하는지 알려주고, 그 에러에 따른 동작을 결정할 수 있도록 만드는 코드는 무엇일까? 바로 except라는 키워드가 이 역할을 한다.

 

 

2. except 문

 

except 문의 포맷은 아래와 같다.

 

----------------------------------------------------

except 에러종류:

     에러 발생 시, 컴퓨터가 수행할 코드 작성

 

** 여러개의 에러를 동일한 방식으로 예외처리하고 싶다면

excep (에러종류1, 에러종류2):

    에러 발생 시, 컴퓨터가 수행할 코드 작성

-----------------------------------------------------

 

다시 아래의 화면을 보자

 

Num2의 변수값을 지정하는 과정에서, w를 숫자로 변환하지 못했기 때문에 컴퓨터는 ValueError라는 에러가 나타났음을 우리에게 알려주었다. 즉, 우리가 try: 문 아래에 작성한 코드에서는 ValueError 가 발생했음을 알 수 있고, 이를 예외처리하지 않으면 앞으로도 이런 에러는 언제든지 발생할 수 있다. 따라서, 우리는 ValueError에 대해, except 키워드를 사용하여 예외 처리를 진행해주어야 한다. 아래와 같이

 

--------------------------------------------------------------------------

print("두 숫자의 합을 구합니다. 두 개의 숫자를 입력해주세요")

 

try:

    a = int(input("Num1: "))

    b = int(input("Num2: "))

 

except ValueError:

    print("숫자가 아닌 문자가 입력되었습니다!!")

 

print("{}와 {}의 합: {}".format(a, b, a + b))

--------------------------------------------------------------------------

 

 

"이제 컴퓨터가 어떤 에러가 일어나는지도 알게 되었고, 이 에러에 대해 예외처리를 했기 때문에 에러가 발생하지 않겠지?"라고 생각하는 분들이 많을텐데... 에러는 발생한다. 왜냐하면, w를 숫자로 바꾸는 것에 대해서는 예외처리 했지만, 마지막 print()문 실행 시, b값이 정의가 되어 있지 않기 때문에 아래와 같은 에러가 발생하게 된다.

 

 

프로그램을 만들다보면 if~else에서 맞닥드리는 문제와 유사한데, 우리는 에러가 발생하게 될 경우, 마지막 줄의 print() 문은 실행할 필요가 없다. 따라서 이 부분은 예외가 발생하지 않았을 때 수행하는 코드라는 것을 컴퓨터에게 명확하게 알려주는 작업이 필요하다. 이를 위해 사용하는 키워드가 else다.

 

3. else

 

사실 else는 설명할 것이 없다. if~ else와 사용 방법이 비슷하기 때문에... 아래와 같이 코드를 수정해주자.

 

------------------------------------------------------------------------

print("두 숫자의 합을 구합니다. 두 개의 숫자를 입력해주세요")

try:
    a = int(input("Num1: "))
    b = int(input("Num2: "))

except ValueError:
    print("숫자가 아닌 문자가 입력되었습니다!!")

else:
    print("{}와 {}의 합: {}".format(a, b, a + b))

------------------------------------------------------------------------

 

변경한 내용을 저장하고 test.py를 실행해보면,

 

 

위와 같이 에러 발생 시에는 "숫자가 아닌 문자가 입력되었습니다!!"라는 문구가, 그렇지 않은 경우에는 두 숫자의 합을 출력해줌을 알 수 있다.

 

정리하자면, try 문에서 에러가 발생할 가능성이 있다면, 에러 발생 여부에 따라, except 또는 else 아래의 코드를 수행하게 된다. 마치 if(에러가 발생하면), else(에러가 없다면)의 관계와 비슷하다.

 

그럼, 저 마지막에 있는 finally는 어디에 쓰이는 녀석일까? 

 

 

4. finally

 

프로그램을 작성하다보면, 예외 처리 코드를 수행하고 나서, 혹은 예외 처리가 아닌 정상 코드를 수행하고 나서라도 반드시 실행해야하는 공통 코드가 존재하게 된다. 우리가 작성한 test.py 프로그램은, 예외가 발생하거나 그렇지 않더라도 프로그램이 종료된다. 따라서, 예외가 발생하거나 그렇지 않은 상황에서도 프로그램이 종료된다는 문구를 출력해주려고 한다. 이렇게 예외처리의 세 키워드를 거쳐 공통적으로 실행해야 하는 코드가 존재할 때 쓰는 키워드가 바로 finally다. 

 

열심히 떠들어봐야(?) 손만 아프니 직접 보자.

 

------------------------------------------------------------------------

print("두 숫자의 합을 구합니다. 두 개의 숫자를 입력해주세요") 

try: 
    a = int(input("Num1: ")) 
    b = int(input("Num2: ")) 

except ValueError: 
    print("숫자가 아닌 문자가 입력되었습니다!!") 

else: 
    print("{}와 {}의 합: {}".format(a, b, a + b))

 

finally:

    print("프로그램이 종료됩니다!")

------------------------------------------------------------------------

 

이 test.py를 실행하면, 오류가 발생하거나 그렇지 않은 경우 모두, 프로그램이 종료된다는 문구가 마지막에 출력되게 된다.

 

 

사실, 필자는 finally문을 잘 사용하지 않는데, try, except, else문 아래에 다음에 진행할 코드를 연속으로 작성하면 되기 때문이다. 아래와 같이.

 

------------------------------------------------------------------------

print("두 숫자의 합을 구합니다. 두 개의 숫자를 입력해주세요") 

try: 
    a = int(input("Num1: ")) 
    b = int(input("Num2: ")) 

except ValueError: 
    print("숫자가 아닌 문자가 입력되었습니다!!") 

else: 
    print("{}와 {}의 합: {}".format(a, b, a + b))

 

print("프로그램이 종료됩니다!")

------------------------------------------------------------------------

 


이번 포스팅에서는 프로그램 실행 시, 나타나는 오류를 예외처리 하는 방법에 대해 알아보았다. 아무래도 자기 자신이 만든 프로그램이 아닌 경우, 사용자가 프로그램 사용 도중에 언제든지 에러가 발생할 수 있기 때문에 프로그램 작성을 위해서 예외처리 방법은 반드시 익혀두는 것이 좋다. 컴퓨터에서 정의된 예외 외에 프로그래머가 예외를 정의하는 방법도 있긴 한데, Python 기초에서 굳이 다루지 않아도 될 내용이라 이 부분에 대해서는 추후 다른 카테고리에서 포스팅을 진행하려 한다.

 

 

지금까지 필자가 포스팅했던 Python과 관련된 내용을 대해 제대로 이해하고 창의적으로 활용할 수만 있다면, 조금 복잡한 프로그램이라도 충분히 작성할 수 있다. 그만큼 배우기 쉽고 활용하기 좋은 언어가 Python이다. C만 배워서 제대로 된 프로그램을 단 하나밖에 만들어보지 못했던 필자는,  Python을 활용해 매우 짧은 기간동안 필자가 원하는 프로그램을 여러 개 만들어 잘 사용하고 있다. 이건 필자가 잘나서 그런것이 아니라(사실 잘나긴 했지만ㅋ) Python의 간결하고 단순하면서도 많은 기능을 제공하는 특성 때문이다. 

 

"야, 너두 Python할수 있어"

 

FIN.

반응형

댓글