Python

[Python] 파이썬 예외 처리(try, except/ finally/ pass/ raise)

Let it out 2024. 2. 8. 14:46

예외 처리란?

파이썬에서 프로그램을 실행 했을 때 에러가 발생하면 프로그램이 강제 종료된다.
 
하지만 에러가 발생해도 프로그램을 계속 실행 시키고 싶을 때 가 있다.
 
이 때 예외 처리를 하면 에러를 무시하고 프로그램이 계속 정상적으로 작동한다.
 
 

 

예외 처리 왜 사용 할까?

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

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를 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번째 요소를 불러와서 오류가 발생하는 예제다.
 
결과를 보면 에러가 발생한다.
 
왜냐하면 ZeroDivisionError 은 0으로 나눌 수 없는 에러만 예외 처리를 해주기 때문이다.
 
즉 예제에서 예외처리를 하기 위해선 인덱싱 에러인 IndexError를 작성해 줘야한다.
 
예외처리에는 AttributeError, NameError, TypeError, 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 뒤에 메시지를 받을 변수 이름을 적어주면 된다. 그러면 오류 종류에 따른 메시지를 받을 수 가 있다.
 
예제에서는 IndexError의 메시지인 list index out of range 메시지를 받게된다.
#test.py
try:
    a = [1]
    print(a[5])

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

여러개의 오류 예외 처리하기

하나의 try문에서 여러개의 오류를 예외 처리 하는 방법을 알아보자.
 
이 때 주의 점은 으로는 위에 첫 번째 방법(1. 모든 오류 예외 처리하기)으로는 여러개의 에러를 처리 할 수 없다.
 
 

1. 여러개의 오류 예외 처리 못하는 예제

예제를 보면 TypeError 와 ZeroDivisionError를 각각 작성 할 때는,
 
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. 여러개의 오류 예외 처리하기

(TypeErro, ZeroDivisionError)를 하나의 괄호로 묶어줬다.
 
오류 이름들을 ( ) 괄호로 묶어서 처리하면 여러개의 오류 예외 처리가 가능하다.
 
근데 메시지 출력은 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
결과 : 
 
pass로 에러가 발생해도 회피 했으니 아무런 결과값이 나오지 않는다.
 

 

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

raise문을 사용하여 일부로 오류를 발생 시킬 수 가 있다.
 
if문이 참이므로 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

반응형