
예외처리
사전에 모든 오류를 if 문을 통해 처리하는 것은 불가능에 가깝고, 예상치 못한 오류를 맞이할 수 있습니다.
그래서 예외처리 관련해서는 코드수행블록과 예외처리블록을 나누어 예외를 다루는 것이 바람직합니다.
첫번째로, Python에서는 try ~ except 문으로 예외처리를 다룹니다.
try 블록 안에 있는 구문을 실행하던 도중 오류를 만나면 중단하고 except 블록이 실행됩니다.
다음 예시는 try 실행 도중 예외가 발생해 try 구문을 중단하고 except 블록으로 넘어갑니다.
num = 0
try:
print("1 try 시작")
result = 10 / num # 예외 발생
print("2 try 종료")
except:
print("3 Except 처리")
print("4 프로그램 정상 종료")두번째로, (try: ~ except 오류명:) 패턴으로 작성합니다. 처리하고자 하는 에러를 except 뒤에 명시하는 방식입니다.
except 뒤에 붙는 에러는 여러 개를 명시할 수 있습니다.
num = 0
num = "0"
try:
print("1 Try 시작")
result = 10 / num # 예외 발생
print("2 Try 종료")
except ZeroDivisionError:
print("3-1 ZeroDivisionError 발생")
except TypeError:
print("3-2 TypeError 발생")
print("4 정상 종료")세번째로, (try: ~ except 오류명 as 변수:) 패턴으로 작성합니다.
발생한 예외객체를 변수에 저장해서 처리하며, 예외객체 e에는 예외 관련 메시지, 추가 정보 등이 들어있습니다.
num = 0
try:
print("1 Try 시작")
result = 10 / num # 예외발생
print("2 Try 종료")
except ZeroDivisionError as e:
print("3-1 ZeroDivisionError 발생")
print(e) # 예외 객체 디버깅
except TypeError:
print("3-2 TypeError 발생")
print("4 프로그램 정상 종료")네번째로, finally를 추가해 예외 발생 여부와 관련없이 수행해야 하는 코드를 작성합니다.
try:
print("1 Try 시작")
f = open('foo.txt', 'r')
a = 10
a = a + bbbbbbb # 예외 발생
except:
print("2 예외처리")
finally:
print("3 Finally")
f.close()예외적으로, 강제로 예외를 발생시키는 방법도 있는데 그것은 raise 키워드를 사용합니다.
예를 들어, Bird라는 클래스를 상속받는 자식 클래스는 반드시 fly() 메소드를 오버라이딩하도록 만들고 싶습니다.
그럴 때, 구현하지 않을 경우 일부러 오류를 발생시킵니다.
class Bird:
def fly(self):
print('fly() 호출')
raise NotImplementError("반드시 fly()를 구현해야 합니다.")
print('fly() 종료')
class Eagle(Bird):
pass
eagle = Eagle()
eagle.fly() # 에러가 발생