[Python] 예외처리 try/except, raise

2022. 3. 19. 12:24Python/Python 기초 정리

반응형

try / except

  • 에러코드 발생 시 취할 액션에 대해 정의해 줄 수 있다.
user = User.objects.get(id=3)
다음 코드에서 id=3인 user가 없는 경우 DoesNotExist를 출력하며 동작을 멈추게 된다. 사용자가 없다면 그에 맞는 액션을 취해야 하지 페이지 에러를 내면 곤란한 경우가 많기 때문에 다음과 같이 예외처리를 해주어야 한다. 주로 데이터베이스에서 데이터를 가져올 때 비슷한 상황이 많이 발생하는데, filter를 사용한다던가 몇 가지 방식이 있지만, 결국엔 데이터가 없을 경우 예외처리는 필요하므로 상황에 맞게 사용하면 좋을 것 같다.
  • 이 코드를 예외처리해주는 코드는 다음과 같다. 
  • DoesNotExist 에러가 발생할시 login페이지로 보내주는 코드이다.
try:
    user = User.objects.get(id=3)
except DoesNotExist:
    return redirect("/login/")

예외의 이름을 모르는 경우 대처법

  • 실제로 프로그래밍 상황에서 어떠한 에러가 발생할지 우리가 모두 알 수는 없는 관계로 exception뒤에 이름을 명시하지 않는다면 모든 에러에 대해 동일한 액션을 취하게 된다.
try:
    user = User.objects.get(id=3)
except:
    return redirect("/login/")

 

에러의 이름을 확인하는 방법

try:
    user = User.objects.get(id=3)
except Exception as ex:
    print('error', ex)
    return redirect("/login/")

raise

  • 사용자가 직접 에러를 발생시키는 방법이다
  • 코드를 읽기 어려워지기 때문에 추천하고 싶은 방식은 아니다
# 올바른 값을 넣지 않으면 에러를 발생시키고 적당한 문구를 표시한다.
def rsp(mine, yours):
    allowed = ['가위','바위', '보']
    if mine not in allowed:
        raise ValueError
    if yours not in allowed:
        raise ValueError

try:
    rsp('가위', '바')
except ValueError:
    print('잘못된 값을 넣었습니다!')
# 190이 넘는 학생을 발견하면 반복을 종료한다.
school = {'1반' : [150, 156, 179, 191, 199], '2반' : [150, 195, 179, 191, 199]}

try:
    for class_number, students in school.items():
        for student in students:
            if student > 190:
                print(class_number, '190을 넘는 학생이 있습니다.')
                # break # 바로 상위 for문은 종료되지만 최고 상위 for문은 종료되지 않는다.
                raise StopIteration
                # 예외가 try 문 안에 있지 않으면 에러 발생시 프로그램이 멈춘다.
except StopIteration:
    print('정상종료')
반응형