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
음수로 나이를 증가시키는 경우를 예외로 둔 예시다.
일반적으로 raise
문은 이렇게 사용되는데, assert
문은 언제 어떻게 쓰이는고?
assert
나의 희망 공식 문서와 stackoverflow를 찾아보려 했다.
근데 공식문서만 봐도 다 알정도로 생각보다 너무 단순했다...
Python 3 - assert statement에 의하면,
assert exp1, exp2
는
if __debug__:
if not exp1: raise AssertionError(exp2)
와 동일하다고 한다.
assert
문이 실행된다고 한다.debug == True
-O
커맨드 옵션 등에 의한 optimization이 없을 때production
환경이 아닌 개발환경에서만 잡아내고 싶은 예외가 있을 때.등등이 있겠다. 대체로 release 전 테스트를 위해 사용되는 듯 하다.
세 번째 상황에 대해서는
"try: ... except AssertionError: ...
로 잡을 수 있지 않느냐?" 라고 할 수 있다.
당근 잡아낼 수 있다. 하지만, assertion
의 목적에 어긋난다고 생각한다.
게다가 코드 결과물도 엉성해진다.
예를 들어, 실제로 assertion error를 예외 처리하는 코드가 있다고 생각해보자.
이 코드를 배포 전에 컴파일하면 assert
문은 모두 사라진다.
그런데 assertion error를 예외 처리하는 코드는 그대로 남아있게 된다.
아주 쌩뚱맞고 엉성한 결과물이다.
둘 다 어떤 상황이 발생해서는 안된다고 코드로 명시해줄 수 있다.
차이점을 따져보자면,
raise
는 실사용 도중에 발생할 수 있는 예외에 대하여assert
는 실사용에서는 발생하기 어렵거나 불가능하나, 앞으로도 발생해서는 안될 예외에 대하여.즉 assert
문은 다른 개발자를 위한 주석으로도 사용될 수 있다고 보인다.