Python 예외처리 [20210904]

Jungsoo kim·2021년 9월 5일
0

wecode

목록 보기
20/30

  이번에는 python의 예외처리에 대해서 알아보려고 한다. 이유는 현재 진행중인 클론 프로젝트에서 회원가입 & 로그인 기능을 구현하는 도중에 예외처리에서 애를 먹었기 때문이다.

<목차>
1. 문제발생
2. 해결책
3. Python 예외처리 사용법
4. 마무리

1. 문제발생

  아래의 코드는 현재 내가 진행중인 클론 프로젝트의 로그인 기능에 관한 코드이다. 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)

2. 해결책

찾아보니 해결책은 정말로 간단했는데, 아래와 같은 코드를 마지막에 입력해주면 되는것 이었다.

except Exception as e:
            return JsonResponse({"message" : e}, status = 500)

  위 코드의 의미는 에러가 발생하였을 때, 예외를 e로 받아서, e를 메세지로 나타내주는 코드이다. 예를 들어, Notexist라는 예외가 발생했다고 치면 이 Notexist가 변수 e에 담기게 되고 "message" : Notexist 형식으로 메세지가 나타나게 된다.

3. Python 예외처리 사용법

  추가로, 파이썬에서 사용하는 예외처리 방법을 간단하게 확인하고자 한다. 예외처리와 관련된 메서드는 4개 (try, except, else, finally)가 있는데 각 매서드의 정의는 아래와 같다.

  • try: 실행할 코드
  • except: 예외가 발생했을 때 처리하는 코드
  • else: 예외가 발생하지 않았을 때 실행할 코드
  • finally: 예외 발생 여부와 상관없이 항상 실행할 코드

예를 들어, 아래와 같은 코드가 있을 때 에러가 발생한 경우와 발생하지 않은 경우의 결과는 다음과 같다.

try:
    x = int(input('나눌 숫자를 입력하세요: '))
    y = 10 / x
except ZeroDivisionError:    # 숫자를 0으로 나눠서 에러가 발생했을 때 실행됨
    print('숫자를 0으로 나눌 수 없습니다.')
else:                        # try의 코드에서 예외가 발생하지 않았을 때 실행됨
    print(y)
finally:                     # 예외 발생 여부와 상관없이 항상 실행됨
    print('코드 실행이 끝났습니다.')

예를 들어, 아래와 같은 코드가 있을 때 에러가 발생한 경우와 발생하지 않은 경우의 결과는 다음과 같다.

  1. 에러가 발생하지 않았을 경우

나눌 숫자를 입력하세요: 2 (입력)
5.0
코드 실행이 끝났습니다.

  1. 에러가 발생했을 경우

나눌 숫자를 입력하세요: 0 (입력)
숫자를 0으로 나눌 수 없습니다.
코드 실행이 끝났습니다.

예외가 발생하였을 때는 except에 포함된 코드가 실행되며, 예외가 발생하지 않았을 때는 else에 작성된 코드가 실행된 것을 확인 할 수 있다.
또한, finally에 포함된 코드는 예외와 상관없이 항상 출력되는 것 역시 확인할 수 있다.

4. 마무리

  유튜브를 통해 다른 현업 개발자 분들이 한 이야기를 들었을 때 최대한 많은 예외처리를 코드 내에서 구현하여 잡아주는 것이 실제 서비스를 제공할 때 좋은 코드라고 들었다. 많은 에러 코드를 잡아주기 위해서는 어떤 에러가 발생하는지 아는 것이 가장 첫 번째이고, 이를 할 수 있게 하는 코드가 위 해결책에서 제시했던 코드이다. 잘 활용하여 최대한 많은 예외를 코드 내에서 잡을 수 있도록 해봐야겠다.

profile
어렵지만 꾸준히 차근차근 해 나가자~!

0개의 댓글