반응형
예외 처리란?
파이썬에서 프로그램을 실행 했을 때 에러가 발생하면 프로그램이 강제 종료된다.
하지만 에러가 발생해도 프로그램을 계속 실행 시키고 싶을 때 가 있다.
이 때 예외 처리를 하면 에러를 무시하고 프로그램이 계속 정상적으로 작동한다.
예외 처리 왜 사용 할까?
예외 처리를 왜 사용하는지 예제를 통해 알아보자.
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
반응형
'Python' 카테고리의 다른 글
[Python] 파이썬 all, any 함수 사용법과 예제 (0) | 2024.02.08 |
---|---|
[Python] 파이썬 절대값 구하기/ abs() 함수 (0) | 2024.02.08 |
[Python] 파이썬 패키지(Packages) 생성과 사용법 (1) | 2024.02.08 |
[Python] 파이썬 모듈(module) 생성과 사용법 (0) | 2024.02.08 |
[Python] 파이썬, 파이참(pycharm) 다른 경로에 있는 모듈 불러오기 (0) | 2024.02.08 |