예외나 오류 에러 다 비슷한 말이다. 헷갈리면 안된다. 파이썬 인터프리터는 기본적으로 오류가 나면 에러메시지를 콘솔에 출력하며 프로그램을 종료한다.
예외 exception 이라는 것은 파이썬이 이들 오류에서 예외적으로 처리를 할 수 있게 허용한 것이다. 예외처리가 되더라도 프로그램은 멈추지 않고 진행된다.
오류를 안나게 만드는게 첫번째 중요하겠지만, 불가피하게 오류가 발생되는 경우도 있다. 다중 사용자 환경이라던가, 동적 라이브러리를 웹상에서 로드해야 한다던가 등등 여러 경우의 수가 있을 것이다.
일단 오류를 내보자
가장 대표적인 에러이다. 사칙연산에서 0을 사용할 수 없는 것은 나눗셈밖에 없다.
여기서 나온 오류의 이름을 기억한다. ZeroDivisionError 이다.
try:
1/0
except:
print("ERROR MESSAGE")
try:
1/0
except ZeroDivisionError:
print("ERROR MESSAGE")
try:
1/0
except ZeroDivisionError as e:
print(e)
- 세가지 방법을 사용한다. 첫번째는 오류가 나면 except 블록을 실행한다. 어떤 오류던 상관없다.
- 두번째는 ZeroDivisionError 인 경우만 except 블록을 실행한다. 다른 오류가 나면 프로그램은 정지하고 오류메시지를 출력한다.
- 세번째는 ZeroDivisionError 인 경우에 에러의 내용까지 가져온다. (e)
당연하지만 오류가 발생하지 않으면 except 문은 실행되지 않는다.
다른 예제를 해본다.
try:
a = [2,4,6,8]
print(a[7])
except IndexError as e:
print(e)
try:
f = open('whatfile','r')
except FileNotFoundError as e:
print(e)
print(FileNotFoundError)
- 첫번째는 인덱스가 범위를 벗어났다.
- 두번째는 파일을 찾지 못했다.
- except에 들어가는 변수는 클래스이다. (toString)
try:
f = open('whatfile', 'r')
a = [2,4,6,8]
print(a[7])
except (IndexError, FileNotFoundError) as e:
print(e)
try 문에서 먼저 발생한 오류메시지만 가져온다는 것에 주의하자. 뒤의 Index 에러는 발생되지 않는다.
오류가 발생되도 그냥 PASS 회피 한다.
try:
f = open('whatfile', 'r')
a = [2,4,6,8]
print(a[7])
except (IndexError, FileNotFoundError) as e:
# print(e)
pass
print("Pass OK")
사용자가 자신의 예외처리를 만들 수 있다. Exception 클래스를 상속한 후 __str__ 를 오버라이드한다. print(e)의 e가 메시지이다.
class ErrorBuilt(Exception):
def __str__(self):
return "MSG: <Error is built now>"
def raise_error(name):
if name == 'number3':
raise ErrorBuilt()
print('hello sir')
try:
raise_error('hello')
raise_error('number3')
except ErrorBuilt as e:
print(e)
raise ErrorBuilt()는 예외처리 문으로 이동시킨다. 다음줄에 try except 문에 구현한다.