기록하는삶
[파이썬/Python] Built in Exception, 예외 처리, try-except 구문 활용 본문
코드를 짜다보면 사용자의 예상치 못한 사용이나, 예상되는 실수들로 인한 오류 및 예외들에 대해 처리해 줄 필요가 있다. 이런 예외들을 exception이라 하며, 보통 아래의 두 가지 경우를 포함한다.
1) 예상 가능한 예외
개발자가 코드 상에서 해결할 수 없는 문제로, 발생했을 때 비정상적인 종료에 앞서 진행 상황을 저장하거나, 오류의 원인을 고지하는 등 추가적인 조치가 필요하다. try-except 구문의 사용이 권장된다.
Ex)
- 함수의 변수를 입력하지 않거나, 잘못된 형식의 변수를 사용하는 경우
- 사용자의 입력에 오류가 있는 경우
- 파일 호출 시 파일이 존재하지 않는 경우
2) 예상 불가능한 예외
개발자의 실수로 인한 문제. 수행 불가능한 코드를 던지는 경우, 인터프리터가 자동으로 예외에 대한 처리를 해준다.
Ex)
- 0으로 나눗셈을 시도하는 경우
- 존재하지 않는 index에 대한 list, tuple의 호출을 시도하는 경우
파이썬에서의 예외 처리(Exception Handling)
1) Built in Exception
파이썬이 제공하는 기본적인 예외 처리는 아래와 같다.
ValueError | 변환할 수 없는 문자/숫자에 대한 변환을 시도 |
IndexError / KeyError | 존재하지 않는 index에 대한 호출 (KeyError는 dictionary에서) |
NameError | 존재하지 않는 (지역/전역)변수의 호출 |
TypeError | 잘못된 type의 변수가 전달된 경우 |
ImportError | 모듈에서 import가 실패 |
FileNotFoundError | 존재하지 않는 파일을 불러올 경우 |
SyntaxError | 문법에 오류가 있는 경우 |
AttributeError | 클래스의 attribute 호출 시 문제가 발생하는 경우 |
RecursionError | 재귀 깊이 초과 |
ZeroDivisionError | 0으로 나누기를 시도 |
ModuleNotFoundError | 설치하지 않은 모듈의 호출 |
OverflowError | 표현할 수 있는 수의 범위를 넘어가는 경우 |
외에 기타 오류들은 링크에서 확인할 수 있다.
2) try - except 구문의 활용
a = [1,2]
for i in range(3):
try:
print(3//i)
print(a[i],b)
except ZeroDivisionError as error:
print(error)
print('0 으로 나누시면 안됩니다!')
except Exception as error2:
print(error2)
print('뭔가 오류가 발생했습니다!')
finally:
print('='*30)
위처럼 일단 try 구문을 시도하여 문제가 발생하지 않으면 그대로 실행하고, 예외가 발생하면 except 구문의 지시에 따른다. 발생하는 예외의 종류에 따라 어떻게 처리할 지 여부를 except 구문에 포함시킬 수 있으며, 예외의 종류에 관계없이 Exception으로 모든 예외를 받을 수도 있다.(혹은 따로 적지 않아도 마찬가지다.) 다만 모든 에러를 Exception으로 받아버리면 사용자가 어떤 에러인지 알 수 없는 문제가 있으므로, 해당 방법은 지양하는 것이 좋다.
또한 finally를 사용하면, 에러 발생 여부와 관계 없이 실행되는 구문을 추가할 수 있다.
예외 처리가 필요한 가장 간단한 문제에 대한 예시는 이 글을 참고하면 된다.
3) 직접 예외 처리 혹은 예외 처리에 대한 문구를 추가하는 경우
print문으로 예외 처리에 대한 문구를 띄우는 것이 아니라, built-in-error처럼 예외 처리 문구를 발생시키고자 하는 경우 raise 함수를 이용할 수 있다.
def f(x,y):
if type(x)!=int or type(y)!=int:
raise TypeError('정수를 입력하세요')
return abs(x-y)
f(2,6)
f(2,'a')
또한 booltype의 조건을 만들어 놓고, 해당 조건을 만족하지 않는 경우 AssertionError를 발생시키는 것도 가능한데, asseert 함수를 사용하면 된다.
def f(x,y):
assert isinstance(x,int) and isinstance(y,int)
return abs(x-y)
f(2,6)
f(2,'a')
마찬가지 문구를 띄우고 싶다면 raise 함수를 적절히 사용해야 한다.
'AI > 파이썬(Python)' 카테고리의 다른 글
[파이썬/Python] pickle 모듈, 객체 영속화, 배열 저장 후 불러오기 (2) | 2022.01.13 |
---|---|
[파이썬/Python] pathlib 모듈, 현재 위치 및 부모 폴더 찾기, 경로의 객체화 (0) | 2022.01.13 |
[파이썬/Python] argparse 모듈 사용법, .py 실행 시 인자 전달 (0) | 2021.12.11 |
[파이썬/Python] sympy 모듈, 미분, 편미분 (0) | 2021.12.09 |
[파이썬/Python] 메모장 활용하기, datetime 활용 (0) | 2021.12.09 |