본문 바로가기
Software/Python

[파이썬의 기본] 예외처리 (try, except, finally, raise)

by lovey25 2019. 4. 24.
반응형

try, except 명령

예외는 어떤 예기치 못한 문제가 발생했을 때 발생하는 에러 메시지 같은 겁니다.

이런 예외가 발생하면 파이썬 프로그램은 중단됩니다. 이렇게 원치 않는 프로그램 중단을 방지하기 위해서는 적절한 예외처리가 필요한데 “try”, “except”가 바로 그때 사용하는 명령어입니다.

예제:

try: 
   var1 = 9 
   var2 = 0 
   print (var1 / var2) 
   print("complete") 
except ZeroDivisionError: 
   print("I can’t divide by ZERO") 

위 예제는 크게 “tyr” 블럭과 “except” 블럭으로 나누어져 있습니다. “try”  블럭에서 변수를 2개 생성해서 각각 9와 0을 할당하고 이를 나눈 결과값을 출력하고 곧이어 “complete”라는 문자열을 출력하도록 되어 있습니다.

그리고 “except”블럭에서는 문자열만 출력하도록 하고 있습니다. 결과는 어떻게 될까요?

결과:

“try”블럭에 있는 출력문들은 무시되고 “except”블럭만 실행된 것처럼 보이네요.

바로 4번째 줄 “var1 / var2”에서 0으로 나누는 오류가 발생했기 때문입니다. 여기서 “ZeroDivisionError”가 발생하였으나 예외처리 로직을 만들어 두었기 때문에 프로그램이 종료되지 않고 예외블럭으로 진행된 것입니다.

파이썬의 기본적인 예외메시지 종류들입니다. 알아두면 유용하겠네요.

몇 가지 예외 메시지들

  • ImportError: 말 그대로 import에 문제가 있을 때
  • IndexError: 리스트의 인덱스를 초과하는 동작이 발생했을 때
  • NameError: 변수명을 특정하지 못할 때
  • SyntaxError: 문법상 오류
  • TypeError: 변수형 사용이 적절하지 못할 때
  • ValueError: 변수형은 일치하지만 값에 문제가 있을 때

 

finally 명령

앞에서는 예상가능한 예외가 발생했을 때 각 예외를 처리하는 분기를 만드는 방법을 알아보았습니다. 그런데 코딩을 하다 보면 미처 알지 못했던 예상치 못한 로직으로 전개될 때도 있기 마련입니다. 그런 경우를 대비해서라도 어떤 예외가 발생하든지 간에 상관없이 무조건 실행이 되는 흐름이 만들어지면 유용할 텐데요. 바로 이 “finally”가 그런 역할을 해 줍니다. 

예제: 

try:  
   print("start")  
   print(9 / 0)  
except ZeroDivisionError:  
   print("devided by ZERO")  
finally:  
   print("execute anyway")  

결과:


예제에서는 3행에서 0나누기가 있어서 “ZeroDivisionError”가 발생하고 “except”블럭으로 들어가게 됩니다. 그런데 여기에서 선언된 적이 없는 변수가 사용되기 때문에 또 예외가 발생하게 됩니다. 코드에는 이 예외에 대란 처리 루프가 없기 때문에 프로그램이 중단되게 되는데요. 그전에 “finally”블럭은 실행이 된 것을 알 수 있습니다. 이처럼 어떤 예외가 있던지 간에 무조건 실행하게 해주는 명령어가 되겠습니다. 

raise 명령 

강재로 예외를 발생시킬 수도 있는데 "raise"라는 키워드를 사용합니다.

예제:

try:
    raise ValueError("Invalid value")

except:
    print("End")

결과:



끝!

반응형

댓글