PYTHON/etc contents

파이썬, try:와 except:의 동작 구조

  • -

파이썬에서는 오류를 처리하는 데에 있어 try:와 except: 두 가지를 가장 주로 사용한다.

 

 

try:와 except:의 사용 방법

주로 try: 하단에는 실행할 코드를 작성하고 except: 하단에는 오류 발생 시에 실행할 코드를 작성한다. 아래의 예시를 살펴보자.

a = [0]

print(a[1])

a라는 변수는 리스트(list) 형태의 자료형이고, 0이라는 값 하나만 입력돼있다. 따라서 a라는 변수 내에 입력돼 있는 데이터에 접근하기 위한 방법은 a[0]과 a[-1] 두 가지 밖에 없는데,   Line 3  에서와 같이 print(a[1])을 사용하게 되면 아래의   Line 5  와 같이   IndexError  가 발생하게 된다.

>>> print(a[1])
Traceback (most recent call last):
  File "<pyshell#7>", line 1, in <module>
    a[1]
IndexError: list index out of range

 

이러한 오류를 해결하기 위해 사용하는 것이 바로   try:  와   except:  문이다. 위와 같이 a[0], a[-1]로만 접근이 가능한 변수에 대해 a[1]로 접근하게 될 경우   IndexError  가 발생하게 되므로, 오류가 발생할 수 있는 코드를   try:  문 아래에 입력해주고 발생하는 오류를   except:  에 함께 입력해줌으로써 오류를 처리할 수 있는 것이다. 아래의 예시를 살펴보자.

>>> 
try:
	print(a[1])
except IndexError:
	print("인덱스 에러가 발생했습니다.")

>>>
인덱스 에러가 발생했습니다.

  Line 2  에서   try:  를 정의한 후   Line 3  에서는 print()문에서 a[1]을 사용함으로써 의도적으로 오류를 발생시켰고, 발생하는 오류인   IndexError  를   except:  문과 함께 사용함으로써 오류가 발생했을 경우 "인덱스 에러가 발생했습니다."라는 문구를 출력하도록 한 후 실행했다. 그 결과,   Line 8  에서 볼 수 있듯이 오류가 발생했다는 문구가 출력됨을 확인할 수 있다.

만약 여기서 우리가 임의로 설정한 문구를 출력하기 보다는 오류가 발생했을 때 출력되는 원래의 오류 문구를 출력하고 싶다면,   as e:  를 추가해주면 된다.
※ Line 5, 10

>>> 
try:
	print(a[1])
except IndexError as e:
	print("에러가 발생했습니다.")
	print(e)

>>>
에러가 발생했습니다.
list index out of range

 

 

 

except: 문은 언제 활성화될까?

앞서 살펴봤던 내용은   try:  문 안에 오류를 발생시키는 단 하나의 코드가 있고, 그 코드에서 발생했을 경우이다. 만약   try:  문의 맨 첫 번째 줄이 아닌 두 번째 줄 내지는 세 번쨰 줄에서 오류가 발생한다면 그 앞의 코드는 어떻게 처리될까? 아래의 예시를 보면 알 수 있듯이,   Line 4  에서는 동일하게 오류가 발생하고 있지만   Line 3  에서의 print(a[0])은 오류가 발생하지 않는 코드이므로 정상적으로 실행된다는 점을 확인할 수 있다.

>>> 
try:
	print(a[0])
	print(a[1])
except IndexError as e:
	print(e)

>>>
0
list index out of range

 

그럼, 만약 세 줄의 코드 중 중간에서 오류가 발생한다면 오류 이후의 코드는 어떻게 될까? 아래의 예제를 확인해보자.

>>> 
try:
	print(a[0])
	print(a[1])
	print(a[-1])
except IndexError as e:
	print(e)

>>>
0
list index out of range

  Line 3  과   Line 5  는 정상적으로 동작하는 코드이고,   Line 4  는   IndexError  를 발생시키는 코드이다. 이러한 코드 구조에서   Line 4는 오류 처리를 수행하고 Line 5로 넘어가지 않고, Line 4에서 오류가 발생하게 되면 Line 5는 코드 수행을 생략한 채로 코드를 종료하게 된다.

그렇다면 이러한 경우, 모든 코드를 정상적으로 동작시키기 위해서는 어떤 구조의 코드를 작성해야 할까? 단순하게 말하자면, 한줄 한줄마다 에러를 처리해주면 된다.

>>>
try:
    print(a[0])
except IndexError as e:
    print(e)
    
try:
    print(a[1])
except IndexError as e:
    print(e)

try:
    print(a[-1])
except IndexError as e:
    print(e)
    
>>>
0
list index out of range
0

 

 


728x90

 

 

반복문 하에서의 예외 처리

앞서 살펴봤던 내용과 달리, 반복문 하에서의 예외 처리는 조금 더 쉽다. 왜냐하면 위와 같이 한 줄마다 예외를 처리하도록 하기 위해 세 번의   try:  와   except:  문을 작성해줄 필요가 없기 때문이다. 아래의 예시를 살펴보자.

>>> a = [1, 2, "3", 4, 5]

>>> for i in a:
	if type(i) == int:
		print("숫자형입니다.")
	else:
		print("문자형입니다.")

>>>
숫자형입니다.
숫자형입니다.
문자형입니다.
숫자형입니다.
숫자형입니다.

  Line 1  에서는 a라는 변수의 자료형이 리스트임을 사전에 설정했고, 리스트 안에는 숫자형, 숫자형, 문자형, 숫자형, 숫자형의 데이터가 입력되어 있다. 여기서 숫자형에는 가능하지만 문자형의 경우에만 적용시킬 수 없는 코드를 제작해서 실행하도록 하면 문자형 데이터인 "3"이 포함되어 있는 코드를 수행할 때 오류가 발생할 것이다.

아래의 예시는 a 변수 내에 포함되어 있는 변수들을 하나씩 반복하면서 0이라는 숫자에 더하여 출력하라는 것이다. 다시 말하자면 a가 1인 경우 0과 1을 더한 1이 출력되며, 2인 경우 0과 2를 더한 2가 출력된다. 그냥, 원래 입력돼있는 값을 출력하라는 것이다. 하지만 세 번째 자리에 있는 "3"은 0과 더할 경우   TypeError  가 발생(  Line 7~10  )하게 된다. 이럴 경우에는 예외 처리를 어떻게 수행할까?

>>> 
for i in a:
	print(0 + i)

>>>
1
2
Traceback (most recent call last):
  File "<pyshell#55>", line 2, in <module>
    print(0 + i)
TypeError: unsupported operand type(s) for +: 'int' and 'str'

 

결론부터 말하자면, 앞서 처리해주었던 오류 처리 방식과 동일하다. 하지만 이 경우에는 한 줄마다 코드를 따로 제작해주지 않아도 알아서 다음 번에 위치한 데이터를 대상으로   print(0 + i)  코드가 실행된다는 점을 확인할 수 있다. 

>>> 
for i in a:
	try:
		print(0 + i)
	except TypeError as e:
		print(e)

>>>
1
2
unsupported operand type(s) for +: 'int' and 'str'
4
5

 

 

 


728x90
반응형
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.