본문 바로가기
코딩 이야기/파이썬(Python)

단도직입 파이썬(Python) – 예외 처리(Exception Handling)

by 아재코더 2021. 12. 16.
파이썬 - 예외처리

우선 예외처리란 의도치 않은 여러가지 오류 또는 에러를 뜻하며 이러한 에러가 발생할 때 무시하거나 특정한 방법으로 처리할 수 있게 합니다. 예를 들어 어떤 수를 0(zero)으로 나누려 시도하면 ZeroDivisionError가 발생한다거나 리스트에서 없는 인덱스를 호출하게 되면 IndexError가 발생하게 됩니다.

>>> 5/0

Traceback (most recent call last):

File "<stdin>", line 1, in <module>

ZeroDivisionError: division by zero

임의의 리스트 a=[1,2,3,4]를 만들고 a[4]를 호출하면 IndexError가 발생합니다.(a리스트 인덱스는 0~3까지 입니다.)

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

>>> a

[1, 2, 3, 4]

>>> a[4]

Traceback (most recent call last):

File "<stdin>", line 1, in <module>

IndexError: list index out of range

예외 처리 방법은 try ~ except문을 다양한 방법으로 사용할 수 있습니다.

while 반복문을 만들고 try, except을 사용하여 정상이면 계속 input으로 숫자를 입력 받아 10을 나누게 되며, 에러가 발생하면 break로 반복루프를 빠져 나오게 됩니다.

0(zero)을 입력 받게 되면 ZeroDivisionError를 발생하게 되어 print(‘0으로 나눌 수 없습니다!\n)문을 실행하고 다시 루프를 돌게 되지만, a를 입력하게 되면 ValueError가 발생하여 break로 반복루프를 빠져 나오게 됩니다.

아래와 같이 오류메시지 변수를 사용할 수도 있습니다.

except ZeroDivisionError as e:

print (e)

결과는 division by zero를 출력하게 됩니다.

try … finally 를 사용 할 수도 있습니다. finally는 에러의 발생여부와 상관없이 실행되며, 보통 사용한 리소스를 닫을 때 많이 사용합니다.

f = open('test.txt','w')

try:

실행문1

실행문 2

finally:

f.close()

test.txt 파일을 쓰기모드로 열고 try문을 실행 후 에러발생여부와 상관없이 finally블록에서 열린 파일을 닫습니다.

except (ZeroDivisionError, ValveError) as e 를 사용하여 변수 e에 오류메시지를 넣어 출력했습니다.

특정오류가 발생 했을 때 pass를 사용하여 회피하는 방법은 아래와 같습니다.

try:

실행문

except:

pass

아래와 같이 try, except, else, finally를 정리 해 봅니다.(else는 설명하지 않아도 되긋죠?!)

try:

실행할 코드

except:

예외발생 시 처리 코드

else:

예외가 발생하지 않을 시 실행할 코드

finally:

예외 발생 여부와 상관없이 실행할 코드

raise문을 사용하여 의도적으로 예외(Exception)를 발생시켜 처리해 보겠습니다.

사용방법 : raise 예외(‘에러메세지’)

try:

a=int(input('짝수 입력 : '))

if a%2 != 0 :

raise Exception('짝수가 아닙니다!')

print (a)

 

except Exception as e:

print ('예외 발생!',e)

실행결과는 아래와 같습니다.

짝수가 아닌 1을 입력하면 예외를 발생시키고 Exception에 ‘짝수가 아닙니다’가 입력되고 다시 except Exception e: 를 통해 e에 입력됩니다.(예제는 Exception을 사용했지만 NotImplementedError, RuntimeError 등도 사용할 수 있습니다.)

그리고 print에서 ‘예외발생’과 e를 출력합니다.

함수 안에서 예외 발생 하였지만 함수 안에 try ~ except 블록이 없기 때문에 상위 코드블록으로 넘기게 되며, 상위 코드블록에서 실행해도 예외 발생 메시지를 띄웁니다. 여기서 상위 코드블록과 하위 코드블록을 구분하는 기준은 main code가 상위 개념이고 그 밑에서 실행되는 함수가 하위 개념입니다.

함수가 먼저 선언되고 정의되어 있지만, 먼저 코딩 되었다고 상위 개념이 아닌 점! 유의하세요~

댓글