[Python] 예외 처리 사용법과 예제 (try, except, finally, rais)

예외 처리 사용법과 예제 (try, except, finally, rais)


예외 처리란?

파이썬에서 프로그램을 실행 했을 때 오류가 발생하면 에러가 뜨면서 실행이 되지 않는다.
하지만 예외적으로 오류를 처리하고 싶을 때가 있다.
이 때 예외 처리를 하면 오류가 발생 했을 때 에러를 무시하고 프로그램이 정상적으로 작동한다.
예제를 통해 알아보자.



예외 처리 왜 사용 할까?

우선 예외 처리를 왜 사용하는지 예제를 통해 알아보자.


1. 일반적으로 2를 0으로 나누기
일반적으로 2/0을 출력 하면 에러가 발생하여 프로그램이 실행되지 않는다.
다음 예제를 보자.
#test.py
print(2/0)
결과 :   
File "C:\Users\skek1\PycharmProjects\pythonProject1\test.py", line 2
    print(2/0)
IndentationError: unexpected indent



2. 예외 처리 하여 2를 0으로 나누기
하지만 예외 처리를 하면 에러가 발생하지 않고 정상적으로 프로그램이 실행된다.
예외 처리를 왜 사용 하는지 감이 올 것이다.
#test.py
try:
2/0
except:
print("Error 입니다.")
결과 : Error 입니다.



try, except문 사용하여 예외 처리하기

이제는 예외 처리 할 수 있는 여러 방법을 알아보자.
기본적으로 try, except문으로 예외 처리 할 수 있는 방법은 3가지가 있다.


1. 모든 오류 예외 처리하기
가장 기본적인 문법이다.
tyr문에는 오류가 발생 할 수 있는 변수나 숫자를 넣는다.
except에는 오류가 발생할 시 실행 할 문장을 적는다.
#test.py
try:
2/0
except:
print("Error 입니다.")
결과 : Error 입니다.



2. 발생 오류만 예외 처리하기
첫 번째 방법과 다른 점은 except 뒤에 ZeroDivisionError 가 있다는 거다.
ZeroDivisionError의 뜻은 0으로 나눌 수 없다는 건데 이 조건을 만족 한 오류만 처리 한다.
이게 무슨 소리냐? 아래 예제를 보자.
#test.py
try:
2/0
except ZeroDivisionError:
print("Error 입니다.")
결과 : Error 입니다.



이번에는 리스트 a의 요소가 1개 지만 6번째 요소를 불러와서 오류가 발생하는 예제다.
결과 값을 보면 에러가 발생한다.
이처럼 조건에 맞는 오류만 잡아 주는 것이 2번째 방법이다.

ZeroDivisionError 뿐만 아니라 AttributeError, NameError, TypeError, IndexError 등 여러가지 에러 이름들이 있다.
즉 예제의 오류를 잡아 줄려면 인덱싱 오류인 IndexError를 작성해 주면 된다.
#test.py
try:
a = [1]
print(a[5])

except ZeroDivisionError:
print("Error 입니다.")
결과 : Traceback (most recent call last):
  File "C:\Users\skek1\PycharmProjects\pythonProject1\test.py", line 4, in <module>
    print(a[5])
IndexError: list index out of range



3. 발생 오류만 예외 처리하고 오류 메시지 받기
3번째 방법은 2번째와 같지만 추가적인 기능은 오류 메시지를 받을 수 있다.
예제를 보자.
as 뒤에 메시지를 받을 변수 이름을 적어주면 된다.
그러면 오류 종류에 따른 메시지를 받을 수 가 있다.
#test.py
try:
a = [1]
print(a[5])

except IndexError as message:
print(message)
결과 : list index out of range




다수의 오류 처리하기

하나의 try문에서 다수의 오류를 처리 하는 방법을 알아보자.
이 때 주의 점은 기본적인 방법으로는 여러 개를 처리 할 수 없다.


1. 다수의 오류 처리 못함
예제를 보면 Type에러만 먼저 발생 하고 Zero division 에러는 발생하지 않는다.
이처럼 여러 개의 오류를 처리 하기 위해서는 아래와 같은 예제를 사용해야 한다.
#test.py
try:
a = "A" #Type 에러
a = a + 1

b = 2/0 #Zero division 에러

except TypeError:
print("Type 에러")

except ZeroDivisionError:
print("zero Division 에러")
결과 : Type 에러



2. 다수의 오류 처리하기
예제처럼 오류 이름은 ( ) 괄호로 묶어서 처리하면 된다.
근데 메시지 출력은 Type에러 밖에 안 뜬다.
이유는 나도 모르겠다.
#test.py
try:
a = "A" #Type 에러
a = a + 1

b = 2/0 #Zero division 에러

except (TypeError, ZeroDivisionError) as message:
print(message)
결과 : can only concatenate str (not "int") to str




finally절 사용하기

try문을 사용 할 때 finally 절을 사용할 수 있다.
finally 절은 try문 수행 후 예외 처리와 관계 없이 무조건 실행된다.
#test.py
try:
a = "A" #Type 에러
a = a + 1

except TypeError:
print("Type 에러")

finally:
print("종료")
결과 : 
Type 에러
종료



pass 사용하여 오류 회피하기

기본적인 TypeError 우선 조건을 만족하면 오류가 발생한다. 그에 따라서 print로 출력하던지, 메시지를 받아 출력 시켰다.
하지만 pass를 사용하면 오류를 아예 회피할 수 있다.
#test.py
try:
a = "A" #Type 에러
a = a + 1

except TypeError:
pass
결과 : 



raise 사용하여 오류 강제로 발생 시키기

raise문을 사용하여 일부로 오류를 발생 시킬 수 가 있다.
예제 실행 시 raise ValueError 가 발생한다.
def num(a):
b = [1,2,3]

if a not in b: #a b안에 없으면 참
raise ValueError

num(4)
  File "C:\Users\skek1\PycharmProjects\pythonProject1\test.py", line 8, in <module>
    num(4)
  File "C:\Users\skek1\PycharmProjects\pythonProject1\test.py", line 6, in num
    raise ValueError

댓글

이 블로그의 인기 게시물

[Arduino] 아두이노 초음파 센서(HC-SR04) 사용하기

[Arduino] 아두이노 조이스틱 사용하기

[자연 환경] 농약의 장단점 농약이 환경과 인간에게 미치는 영향