[Python3] assert vs raise

SangHun·2021년 9월 23일
0
post-custom-banner

raise

raise는 Python3 코드를 작성하면서 자주 써먹어왔던 구문이다.
코드 중간에 예외 상황을 미리 확인하고 에러를 일으키는 방식이다.
예를 들어보자.

class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age
        
    def increase_age(self, increase_step):
        if increase_step < 0:
            raise Exception("Illegal number")
        self.age += increase_step

음수로 나이를 증가시키는 경우를 예외로 둔 예시다.

언제 사용될까?

  • 발생해서는 안되는 예외 상황을 명시
  • 해당 예외가 발생시킬 수 있는 side effect 예방

일반적으로 raise문은 이렇게 사용되는데, assert문은 언제 어떻게 쓰이는고?

assert

나의 희망 공식 문서와 stackoverflow를 찾아보려 했다.
근데 공식문서만 봐도 다 알정도로 생각보다 너무 단순했다...
Python 3 - assert statement에 의하면,
assert exp1, exp2

if __debug__:
    if not exp1: raise AssertionError(exp2)

와 동일하다고 한다.

먼저 아래의 경우에 assert 문이 실행된다고 한다.

그럼 언제 쓰일까?

  • 발생해서는 안되는 예외 상황을 개발자에게 명시
  • production 환경이 아닌 개발환경에서만 잡아내고 싶은 예외가 있을 때.
  • 예외 처리할 필요도 없이 발생하면 무조건 프로그램 동작을 멈춰야 하는 예외를 잡아낼 때.

등등이 있겠다. 대체로 release 전 테스트를 위해 사용되는 듯 하다.

세 번째 상황에 대해서는
"try: ... except AssertionError: ...로 잡을 수 있지 않느냐?" 라고 할 수 있다.
당근 잡아낼 수 있다. 하지만, assertion의 목적에 어긋난다고 생각한다.
게다가 코드 결과물도 엉성해진다.
예를 들어, 실제로 assertion error를 예외 처리하는 코드가 있다고 생각해보자.
이 코드를 배포 전에 컴파일하면 assert문은 모두 사라진다.
그런데 assertion error를 예외 처리하는 코드는 그대로 남아있게 된다.
아주 쌩뚱맞고 엉성한 결과물이다.

공통점, 그리고 차이

둘 다 어떤 상황이 발생해서는 안된다고 코드로 명시해줄 수 있다.
차이점을 따져보자면,

  • raise는 실사용 도중에 발생할 수 있는 예외에 대하여
  • assert는 실사용에서는 발생하기 어렵거나 불가능하나, 앞으로도 발생해서는 안될 예외에 대하여.

assert문은 다른 개발자를 위한 주석으로도 사용될 수 있다고 보인다.

profile
개발괴발자
post-custom-banner

0개의 댓글