본문 바로가기

Programming/Python

Do it! 공부단 7일차 | ch05 파이썬 날개달기_예외 처리

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)

pass 사용 전

try:
    f = open("없는파일", 'r')
except FileNotFoundError:
    pass

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! 점프 투 파이썬』을 읽은 후 작성한 글입니다.

 

Do it! 점프 투 파이썬

코딩을 처음 배우는 중·고등학생과 나만의 경쟁력을 갖추고 싶은 문과생, 소프트웨어 시대에 대비하여 새로운 스펙을 준비하려는 직장인까지! 모두 ‘점프 투 파이썬’으로 프로그래밍을 시작

www.easyspub.co.kr