04 예외처리
- 프로그램을 만들다 보면 오류를 무식하고 싶을 때가 있다.
- 파이썬에서는 try, except를 사용해서 예외적으로 오류를 처리한다.
04-1 오류 예외 처리 기법
try, except문의 기본 구조를 보자.
try:
· · ·
except [발생오류[as 오류 메시지 변수]]:
· · ·
try 블록에서 오류가 발생하면 except 블록이 수행된다.
*[] 기호는 괄호 안의 내용을 생략할 수 있다는 관례 표기이다.
try, except문은 세 가지 방법으로 사용 가능하다.
- try, except만 쓰는 방법: 오류 종류에 상관없이 오류가 발생하면 except 블록을 수행한다.
- 발생 오류를 포함하는 방법: 오류가 except문에 미리 정해놓은 오류 이름과 일치할 때 except문을 수행한다.
- 발생 오류와 오류 메시지 변수를 포함하는 방법: 두 번째 경우에서 오류 메시지의 내용을 알고 싶을 때 사용한다.
세 번째 방법의 예시를 보자.
#except.py
def test(a):
try:
result = 4 / a
return result
except ZeroDivisionError as e:
print(e)
ZeroDivisionError가 생기면 오류 메시지 변수 e를 출력하는 함수를 만들었다. test() 함수의 인수에 0을 넣으니 오류가 발생해 메시지가 출력되었다.
04-2 try... finally
- try문에서는 finally 절을 사용할 수 있다.
- finally 절은 예외 발생 여부에 상관없이 항상 수행된다.
- 보통 사용한 리소스를 close 해야 할 때 많이 사용한다(예) finally: f.close()).
04-3 여러 개의 오류 처리하기
여러 개의 오류를 처리하기 위해 except 블록을 여러 개 사용할 수 있다. 예시를 보자.
try:
a = [1,2]
print(a[3])
4/0
except ZeroDivisionError:
print("0으로 나눌 수 없습니다.")
except IndexError:
print("인덱싱 할 수 없습니다")
"""
오류 함께 처리하기
except(ZeroDivisionError, IndexError) as e:
print e
"""
04-4 오류 회피
pass를 사용하면 특정 오류가 발생하더라도 그냥 회피하여 넘어갈 수 있다. 예시를 보자.
try:
f = open("없는파일", 'r')
except FileNotFoundError as e:
print(e)
try:
f = open("없는파일", 'r')
except FileNotFoundError:
pass
04-5 오류 발생
raise를 사용하면 오류를 일부러 발생시킬 수 있다.
Bird 클래스를 상속받는 자식 클래스는 반드시 fly 함수를 구현하도록 해야 한다고 가정해보자.
#except_class.py
class Bird:
def fly(self):
raise NotImplementedError
class Eagle(Bird):
pass
eagle = Eagle()
eagle.fly()
raise NotImplementedError를 Bird 클래스에서 작성했는데 이를 상속받은 Eagle 클래스에서 fly 함수를 작성하지 않아 에러가 발생했다.
*raise NotImplementedError은 파이썬 내장 오류로 꼭 작성해야 하는 부분이 구현되지 않았을 때 오류를 일으키기 위해 사용한다.
#except_class.py
class Bird:
def fly(self):
raise NotImplementedError
class Eagle(Bird):
def fly(self):
print("very fast")
eagle = Eagle()
eagle.fly()
Eagle 클래스에 fly 함수를 작성해주니 에러가 사라졌다.
이처럼 raise를 사용하면 일부러 발생시켜 프로그램이 제대로 작성되도록 할 수 있다.
04-6 예외 만들기
- 프로그램 실행 도중 특수한 경우에만 예외 처리를 할 수 있다.
- 예외는 파이썬 내장 클래스인 Exception 클래스를 상속해서 만든다.
#except_ExceptionClass.py
class MyError(Exception):
pass
#별명을 출력하는 함수 작성
def say_nick(nick):
if nick == '바보':
raise MyError()
print(nick)
say_nick("천사")
say_nick("바보")
- 파이썬 내장 클래스 Exception을 상속받는 MyError클래스를 만들었다.
- 그리고 별명을 출력하는 say_nick함수를 만들어 매개변수가 '바보'일 때 MyError가 발생하도록 하였다.
이번에는 예외 처리 기법을 사용하여 MyError 발생을 예외처리해보자.
#except_ExceptionClass.py
class MyError(Exception):
pass
#별명을 출력하는 함수 작성
def say_nick(nick):
if nick == '바보':
raise MyError()
print(nick)
try:
say_nick("천사")
say_nick("바보")
except MyError:
print("허용되지 않는 별명입니다.")
try, except문을 사용해 MyError가 발생하면 문자열 "허용되지 않는 별명입니다."을 출력하도록 했다.
#except_ExceptionClass.py
class MyError(Exception):
def __str__(self):
return "허용되지 않는 별명입니다."
#별명을 출력하는 함수 작성
def say_nick(nick):
if nick == '바보':
raise MyError()
print(nick)
try:
say_nick("천사")
say_nick("바보")
except MyError as e:
print(e)
오류 메시지 출력도 사용이 가능한데, 이 경우에는 __str__메서드를 오류 클래스에 구현해야 한다. 결괏값은 위와 같다.
*__str__메서드는 print(e)처럼 오류 메시지를 print문으로 출력할 경우에 호출되는 메시지다.
이 글은 책 『Do it! 점프 투 파이썬』을 읽은 후 작성한 글입니다.
'Programming > Python' 카테고리의 다른 글
Do it! 공부단 8일차 | ch06 간단한 스크립트와 함수 만들기 (0) | 2021.03.25 |
---|---|
Do it! 공부단 7일차 | ch05 파이썬 날개달기_내장 함수 (0) | 2021.03.23 |
Do it! 공부단 6일차 | ch05 파이썬 날개달기_패키지 (0) | 2021.03.22 |
Do it! 공부단 6일차 | ch05 파이썬 날개달기_모듈 (0) | 2021.03.22 |
Do it! 공부단 5일차 | ch05 파이썬 날개달기_클래스 (0) | 2021.03.18 |