예외 처리하기
그동안 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 appendstringtohello
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로 양수를 받아야 합니다.
기존의 에러들처럼 그럴듯하게 에러 화면이 출력된다.