예외 처리하기

그동안 Python 코딩을 하면서 NameError, AttributeError, TypeError 등 많은 에러들을 봐왔을 것이다. 이번엔 그런 에러들을 따로 처리해보는 연습을 해볼 것이다.
먼저 다음과 같이 간단한 함수를 만들었다.

def append_string_to_hello(string):  
    return "hello, " + string

append_string_to_hello("python") # hello, python  

이 함수는 parameter로 str형 데이터가 아닌 int형 데이터를 받았을 때 다음과 같은 에러가 뜬다.

append_string_to_hello(5)  

Traceback (most recent call last):
  File "aa.py", line 4, in
    print(appendstringtohello(5))
  File "aa.py", line 2, in append
stringtohello
    return "hello, " + string
TypeError: Can't convert 'int' object to str implicitly

int형 데이터와 str형 데이터를 더할 수 없어 TypeError가 발생하였다.
이와 같은 에러가 발생했을 시 우리가 원하는 동작을 하도록 바꾸어보자.

def append_string_to_hello(string):  
    try:
        return "hello, " + string
    except TypeError as err:
        print('에러가 검출됨!')
        return err
    finally:
        print("어쨌든 끝남")

다시 int형 데이터를 함수에 넣어 실행해보면

에러가 검출됨!
어쨋든 끝남
TypeError("Can't convert 'int' object to str implicitly")

아까와 다르게 에러가 뜨면서 끝나지 않고, 마치 에러가 뜰 걸 이미 예상이라도 했던 것처럼 정상적으로 출력된다. 에러가 났지만 전혀 당황하지 않았음을 '!'를 통해서 알 수 있다.
try, except 는 항상 세트로 쓰이고, finally는 써도 되고 안 써도 된다. 먼저 try에서 해당하는 코드를 실행하고 실행 중에 예외가 발생하면 except가 실행된다. 그리고 finally는 에러가 발생하든 발생하지 않든 마지막에 무조건 실행된다.
지금은 기존에 있는 Exception 클래스를 상속받은 TypeError 클래스를 사용하였지만, 내가 직접 예외 클래스를 만들어 볼 수도 있다.

def fibonacci(n):  
    if n == 0 or n == 1:
        return n
    return n * fibonacci(n-1)

위와 같은 fibonacci 함수에서 n에 음수가 들어왔을 시 예외를 따로 처리할려고 한다.

class FibonacciShouldNotHaveNegativeNumberError(Exception): # object > Exception

    def __init__(self):
        pass

    def __str__(self):
        return "피보나치 함수는 parameter로 양수를 받아야 합니다."

Exception 클래스를 상속받은 에러 클래스를 하나 만들었다.
__str__(self) 함수는 아래와 같은 에러 문구를 출력해주는 역할을 한다.

TypeError: Can't convert 'int' object to str implicitly

이제 아까 만든 fibonacci 함수에 방금 만든 클래스를 이용하여 예외 부분을 추가해주자.

def fibonacci(n):  
    if n < 0:
        raise FibonacciShouldNotHaveNegativeNumberError()
    if n == 0 or n == 1:
        return n
    return n * fibonacci(n-1)

fibonacci 함수에 음수를 parameter로 넣으면

fibonacci(-1)  

FibonacciShouldNotHaveNegativeNumberError: 피보나치 수열은 parameter로 양수를 받아야 합니다.

기존의 에러들처럼 그럴듯하게 에러 화면이 출력된다.