Appia의 IT세상

파이썬[Python] 011 예외처리(Exception) 본문

Python/Python 기본

파이썬[Python] 011 예외처리(Exception)

Appia 2019. 12. 27. 07:17
반응형

오늘은 예외처리에 대해서 이야기를 해보고자 합니다. 예외처리라는 것은 그래도 실제로 프로그래밍을 하는 사람의 의도와 다르게 프로그래밍이 동작했을 경우를 대비하여 관련하여 문제 상황에 따른 동작등을 있게 프로그래밍 하는 것입니다.

 

작업을 하다 보면 모든 불규칙한 상황과 예상치 못한 입력등에 프로그램등이 동작하지 않게 됩니다. 저의 경우에도 그런 예가 있습니다. 예전에 엑셀을 있는 데이터(인터페이스 정보) 바탕으로 특정 소스 코드를 생성하는 파이썬 프로그래밍을 한적이 있습니다. 하지만, 사용자의 실수로 인하여 특정 칸에 데이터가 들어가 있지 않았고, 관련하여 입력값이 None Type 되어 아무런 동작을 하지 않았습니다. 당시 문에 대한 예외 처리 등을 하지 않았고, 상황에 대해서 확인하기 위해서 별도의 디버깅을 했었던 기억이 있습니다.

 

그래서 오늘은 이런 부분들을 대비 하기 위한 예외 처리에 대해서 간단히 살펴보도록 하겠습니다.

 

try - except 구문

우선 예외 처리를 하기 위해서는 try-except 구문을 사용해야 합니다. 일반 기본적인 원칙부터 보시면 다음과 같습니다.

   try : 

         <실제 동작할 코드>

   except : 

         <에러 발생시 동작할 코드>

 

먼저 다음과 같은 코드가 있다고 가정하겠습니다. 부분을 위와 같은 양식을 바탕으로 예외 처리를 하고 싶해보겠습니다.  

 

<기본 코드>

def funA(str):
   print("Welcome : "+str )
   
funA(1)

 

<예외처리 된 코드>

def funA(str):
   print("Welcome : "+str )
try : 
    funA(1)
except: 
    print("There are Error")

 

보이는 바와 같이 예외를 적용할 부분, 기존 소스 코드에 대해서 try 구분에 입력합니다. 그리고 문제가 발생했을 때에 동작할 부분들을 except 구문에 입력합니다. 이렇게 하면 기본적인 예외 처리가 동작합니다. 그럼 위의 예외 처리가 된 코드를 실행해보겠습니다. 다음과 같은 결과가 나옵니다. 

 

There are Error

 

하지만, 이럴 경우도 디버깅을 피할 수는 없다. 물론 이럴 경우 원인이 무언인지에 대해 대해서 정확하게 알아야지, 코드를 수정할 있기 때문이다. 그래서 에러 코드에 따라서 각각 예외를 있다. 먼저 위에 있는 원 코드를 실행해보겠습니다. 

 

Traceback (most recent call last):
  File "C:/Users/Bens/PycharmProjects/Blogger/Example.py", line 5, in <module>
    funA(1)
  File "C:/Users/Bens/PycharmProjects/Blogger/Example.py", line 2, in funA
    print("Welcome : "+str )
TypeError: can only concatenate str (not "int") to str

 

위와 같은 결과가 나옵니다. 여기서 에러에 대한 특정 코드에 대해서 가장 마지막 줄 앞에 명시하게 됩니다. 여기서는 TypeError가 됩니다. 즉, 에러가 나올 때에 다음 보이는 에러코드에 따라서 예외처리를 별도로 할 수 있습니다. 

 

다음과 같은 형태로 있다.

   try: 

          <실제 동작할 코드>

   except 에러코드1 :

          <에러코드1에 동작할 코드>

   except 에러코드2 :

          <에러코드2에 동작할 코드>

   except 에러코드3 :

          <에러코드3에 동작할 코드>

   else : 

           <나머지 예외 사항에 실행할 코드>

 

그럼 간단하게 위의 예제를 바탕으로 조금 더 살을 붙여서, 한번 만들어 봤습니다. 

 

def funA(str):
   print("Welcome : "+str )
a = 1
try :
    funA(a)
except IOError :
    print("OK")
except TypeError:
    print("There are errors")

 

위와 예시를 실행했던 결과와 똑같이 나옵니다. 물론,임의적으로 만들었기 때문에 똑같이 나올 것입니다. 그럼 혹시 예외 처리를 할 경우, 각 예외부분을 인자값으로 사용가능합니다. 간단한 예를 다음과 같이 보겠습니다. 

 

def funA(str):
	print("Welcome : "+str )
	B = 1
	try :
		funA(B)
	except IOError as a:
		print("OK :"+str(a))
    except TypeError as a:
		print("There are errors: "+str(a))

 

as를 이용해서 위의 본 문에서 사용한 변수를 에러 발생시 동작할 부분에서 변수로 사용할 수 있게 했습니다. 위의 코드를 실행하면 다음과 같은 결과를 얻을 수 있습니다. 

 

There are errors: can only concatenate str (not "int") to str

 

finally 문 

종종 그럴 경우가 있습니다. 에러가 발생하든 안하든 관련해서 반드시 동작해야 하는 동작이 있다면, finally 구문을 사용하면 됩니다. 

 

   try:

          <실제 동작할 코드>

   except 에러코드1 :

          <에러코드1에 동작할 코드>

   finally : 

          <무조건 실행>

 

raise 명령어 

이제 위의 부분에서 인의적으로 예외를 만들어야 하는 경우가 생길 수 있습니다. 또는 사용자가 정한 에러 코드를 바탕으로 에러가 나야 하는 경우가 있습다. 관련해서 작업을 진행 해보도록 하겠습니다. 먼저 raise 명령어는 다음과 같은 형태로 사용합니다. 

 

raise [에러코드 [인자값]]

 

위의 경우만 봐서는 참 어렸습니다. 그럼 다음과 같은 예시를 한번 살펴보면서 임의적으로 예외를 만든 것에 대해서 살펴보도록 하겠습니다. 

def funA(str):
    print("Welcome : " + str)

B = 1
try:
    raise IOError
    funA(B)
except IOError as a:
    print("OK :" + str(a))
except TypeError as a:
    print("There are errors: " + str(a))

 

위의 예시를 실행하면 다음과 같은 결과를 얻을 수 있습니다. 

 

OK :

 

raise 문을 사용할 때는 기본적으로 다음 python에서 제공하는 기본 예외들을 사용해야 합니다. 아니면 기본으로 제공하는 예외를 상속받아 별도의 예외를 만들 수도 있습니다. ( 이부분은 향후 별도로 포스팅 하겠습니다.) 

 

오늘은 예외 처리 하는 방법에 대해서 간단히 살펴 보았습니다. 아마도 다음시간 클래스를 하면서 간단한한 부분에 대해서는 다 정리 되어 이제는 좀더 재미나고 응용하는 부분으로 포스팅을 올려볼까 합니다. 혹 궁금하시거나 문의 사항 있으시면 언제든지 댓글 및 방명록에 글 남겨 주세요. 감사합니다. 

반응형
Comments