python
에서 예외 처리를 위한 try
, except
문의 기본 구조이다.
try 블록 수행 중 오류가 발생하면 except 블록이 수행된다.
try 블록에서 오류가 발생하지 않는다면 except 블록은 수행되지 않는다.
try:
...
except [발생 오류[as 오류 메시지 변수]]:
...
[]
는 생략할 수 있다.
따라서 아래 처럼 세 가지 방법으로 예외 처리가 가능하다.
# 오류 종류에 상관없이 오류가 발생하면 except 블록을 수행
try:
...
except:
...
# 오류가 발생했을 때 except문에 미리 정해 놓은 오류 이름과 일치할 때만 except 블록을 수행
try:
...
except 발생 오류:
...
# 오류 메시지의 내용까지 알고 싶을 때 사용하는 방법
try:
...
except 발생 오류 as 오류 메시지 변수:
...
try:
4 / 0
except ZeroDivisionError as e:
print(e)
'''
division by zero
'''
try
문은 finally
절을 사용할 수 있다.
finally
절은 try
문 예외 발생 여부와 상관 없이 항상 수행된다.
사용한 resource를 close해야 할 때 많이 사용
f = open('foo.txt', 'w')
try:
# 무언가를 수행한다.
finally:
f.close()
try
문 에서 발생하는 여러 종류의 에러를 처리하기 위해 except
을 여러개 사용할 수 있다.
try:
a = [1,2]
print(a[3])
4/0
except ZeroDivisionError:
print("0으로 나눌 수 없습니다.")
except IndexError:
print("인덱싱 할 수 없습니다.")
만일 같은 열에서 동시에 에러를 처리하기 위해서는 아래와 같이 괄호를 사용해 묶어 처리해야 한다.
try:
a = [1,2]
print(a[3])
4/0
except (ZeroDivisionError, IndexError) as e:
print(e)
pass
를 이용하면 에러 발생 시 에리 처리 없이 단순히 회피할 수 있다.
try:
f = open("나없는파일", 'r')
except FileNotFoundError:
pass
raise
명령어를 사용하면 에러를 강제로 발생 시킬 수 있다.
class Bird:
def fly(self):
raise NotImplementedError
위와 같이 raise
를 발생시키는 method를 통해서 자식 클래스에 강제적으로 overriding해야 하는 method를 지정할 수 있다.
NotImplementedError
는 파이썬 내장 오류로, 꼭 작성해야 하는 부분이 구현되지 않았을 경우 일부러 오류를 일으키기 위해 사용
class Bird:
def fly(self):
raise NotImplementedError
# NotImplementedError 발생
class Eagle(Bird):
pass
eagle = Eagle()
eagle.fly()
# 정상 처리
class Eagle(Bird):
def fly(self):
print("very fast")
eagle = Eagle()
eagle.fly()
Python
내장 Class인 Exception
Class를 상속하면 자체적으로 예외 Class를 만들 수 있다.
class MyError(Exception):
pass
print(e)
로 에러 메시지가 보이게 하려면 에러 class에 다음과 같은 __str__
method를 구현해야 한다.
__str__
method는 print(e)처럼 에러 메시지를 print문으로 출력할 경우에 호출되는 method이다.
class MyError(Exception):
def __str__(self):
return "허용되지 않는 별명입니다."