[Python] 예외처리(Exception handling)
코딩을 하다보면 오류 발생하는 경우가 정말 정말 정말 정말 많다:)
오류의 종류를 살펴보면,
- 구문적 오류(Syntax Error)
- 문법 오류에 의하여 기계어 변환 과정에서 발생하는 오류
- 실행 오류(Runtime Error)
- 프로그램 실행 중 발생하여 프로그램이 비정상적으로 종료되는 오류
- 의미적 오류(Semantic Error)
- 문법은 정상이지만 실행의 결과가 원하는 대로 나오지 않는 오류
- 이런 경우 어디서 오류가 났는지 찾기가 어렵다고 한다...
예외처리
프로그램 개발을 하다보면 예상치 못한 상황이 많이 생긴다.
입출력 오류와 같은 상황 발생 시 프로그램 종료를 방지하기 위해 예외처리 구문이 쓰인다.
또한, 개발자가 예외 발생 가능 부분을 어떻게 대응하라고 지정해줄 수 있다.
try:
code context(예외 발생할 거 같은 코드)
except:
code context(예외 발생 시 처리 내용 작성)
예를 들어, 0으로 나누어 생기는 상황이 발생해 오류가 생긴다고 해보자.
n = 100
for i in range(0,10):
try:
print(n/i)
except:
print("에러발생")
=> 만약, i가 0이어서 나누기 오류가 생긴다면 "에러발생" 구문을 실행한다.
어떤 에러인지 에러메세지를 확인할 수 있다.
n = 100
for i in range(0,10):
try:
print(n/i)
except ZeroDivision Error as e:
print(e) # division by zero
이렇게 에러 메세지를 출력할 수도 있다.
+) try ~ except ~ else 문
n = 100
for i in range(10):
try:
result = n/i
except ZeroDivisionError as e:
print(e)
else:
result **= 2
print(result)
=> else문은 예외가 발생하지 않을 경우 수행할 코드를 입력한다.
n/i가 에러가 나면 except문을 실행해 에러 메세지를 출력하고
n/i가 에러가 나지 않으면 else문을 실행해 출력한다.
+) ~ finally문
for a in range(3):
try:
result = 100/a
except ZeroDivisionError as e:
print(e)
else:
print("정상적으로 연산되었습니다.")
finally:
print("처리완료")
=> finally문은 에러 발생 여부와 상관 없이 무조건 수행한다.
✅ 정리하자면
try:
예외가 발생 가능한 코드
except:
예외 발생 시 실행 코드
else:
예외 발생하지 않았을 경우 실행
finally:
예외 발생 여부와 상관없이 항상 실행할 코드
많이 발생하는 오류
🚫 IndexError : 리스트의 인덱스 범위를 넘어갈 때 발생
a = [1, 2, 3]
a[5] #error
🚫 NameError : 정의되지 않은 변수를 사용하려 할 때 발생
name # error, name 변수가 정의되지 않았기 때문
🚫 ValueError : 변환할 수 없는 자료형 변환을 시도할 때 발생
a = "홍길동"
int(a) # str -> int로 변환시도해서 error
🚫 TypeError : 자료형이 맞지 않는 연산을 시도하거나 호출할 수 없는 객체를 함수처럼 호출할 때 발생
12/"나이" # error
a = 10
a() # error
🚫 FileNotFoundError : 없는 파일을 읽어드리려 할 때 발생
🚫 AttributeError : 객체에 없는 속성을 사용하려 할 때 발생
class MyClass:
def do_func(self):
self.a = self.a + 2 #error
mc = MyClass()
mc.do_func() #error
에러 발생 문
raise문
개발자가 필요할 때 에러를 일부로 발생시킬 때 사용하는 문이다.
if문과 함께 많이 사용된다.
num = 0
if num == 0:
raise ValueError("0으로 나눌 수 없어요")
=> num 값이 0인 경우 에러를 발생시키고, "0으로 나눌 수 없어요"라는 메세지를 출력한다.
assert문
조건이 거짓일 경우에만 에러를 발생시킨다.
def div(a, b):
assert b > 0, "1이상의 정수만 입력하세요"
return a/b
div(6,0)
=> b가 0보다 작을 때 에러를 발생시키고 에러 메세지를 출력한다.