이번에는 python의 예외처리에 대해서 알아보려고 한다. 이유는 현재 진행중인 클론 프로젝트에서 회원가입 & 로그인 기능을 구현하는 도중에 예외처리에서 애를 먹었기 때문이다.
<목차>
1. 문제발생
2. 해결책
3. Python 예외처리 사용법
4. 마무리
아래의 코드는 현재 내가 진행중인 클론 프로젝트의 로그인 기능에 관한 코드이다. Tyr - Except 구문을 사용하여 예외 처리를 하려고 아래와 같이 구현을 했는데, 예외의 종류를 알아보던 도중 한 가지 문제가 발생하였다. Key Error 이외에는 어떤 에러가 발생했는지 알 수가 없는것 이었다.
그래서 Key Error이외의 에러가 발생했을 때 어떤 에러인지 알 수 있는 방법이 필요했다.
class LogInView(View):
def post(self, request):
data = json.loads(request.body)
try:
account_name = data['account_name']
password = data['password']
if User.objects.filter(account_name = account_name).exists():
user_account_name = User.objects.get(account_name = account_name)
if bcrypt.checkpw(password.encode('utf-8'), user_account_name.password.encode('utf-8')):
token = jwt.encode({'id' : user_account_name.id}, SECRET_KEY, algorithm='HS256')
return JsonResponse({"message" : "LogIn Success", "Token" : token}, status = 200)
return JsonResponse({"message" : "INVALID_PASSWORD"}, status = 401)
return JsonResponse({"message" : "INVALID_USER"}, status = 401)
except KeyError:
return JsonResponse({"message" : "KEY_ERROR"}, status = 400)
찾아보니 해결책은 정말로 간단했는데, 아래와 같은 코드를 마지막에 입력해주면 되는것 이었다.
except Exception as e:
return JsonResponse({"message" : e}, status = 500)
위 코드의 의미는 에러가 발생하였을 때, 예외를 e로 받아서, e를 메세지로 나타내주는 코드이다. 예를 들어, Notexist라는 예외가 발생했다고 치면 이 Notexist가 변수 e에 담기게 되고 "message" : Notexist 형식으로 메세지가 나타나게 된다.
추가로, 파이썬에서 사용하는 예외처리 방법을 간단하게 확인하고자 한다. 예외처리와 관련된 메서드는 4개 (try, except, else, finally)가 있는데 각 매서드의 정의는 아래와 같다.
예를 들어, 아래와 같은 코드가 있을 때 에러가 발생한 경우와 발생하지 않은 경우의 결과는 다음과 같다.
try:
x = int(input('나눌 숫자를 입력하세요: '))
y = 10 / x
except ZeroDivisionError: # 숫자를 0으로 나눠서 에러가 발생했을 때 실행됨
print('숫자를 0으로 나눌 수 없습니다.')
else: # try의 코드에서 예외가 발생하지 않았을 때 실행됨
print(y)
finally: # 예외 발생 여부와 상관없이 항상 실행됨
print('코드 실행이 끝났습니다.')
예를 들어, 아래와 같은 코드가 있을 때 에러가 발생한 경우와 발생하지 않은 경우의 결과는 다음과 같다.
나눌 숫자를 입력하세요: 2 (입력)
5.0
코드 실행이 끝났습니다.
나눌 숫자를 입력하세요: 0 (입력)
숫자를 0으로 나눌 수 없습니다.
코드 실행이 끝났습니다.
예외가 발생하였을 때는 except에 포함된 코드가 실행되며, 예외가 발생하지 않았을 때는 else에 작성된 코드가 실행된 것을 확인 할 수 있다.
또한, finally에 포함된 코드는 예외와 상관없이 항상 출력되는 것 역시 확인할 수 있다.
유튜브를 통해 다른 현업 개발자 분들이 한 이야기를 들었을 때 최대한 많은 예외처리를 코드 내에서 구현하여 잡아주는 것이 실제 서비스를 제공할 때 좋은 코드라고 들었다. 많은 에러 코드를 잡아주기 위해서는 어떤 에러가 발생하는지 아는 것이 가장 첫 번째이고, 이를 할 수 있게 하는 코드가 위 해결책에서 제시했던 코드이다. 잘 활용하여 최대한 많은 예외를 코드 내에서 잡을 수 있도록 해봐야겠다.