본문 바로가기
coding 📟/python 💻

[Python] assert raise 비교

by 고돌한 데이터 사이언스 2022. 3. 8.
반응형

 

파이썬으로 개발을 진행하다 보면 

코드 중간에 예외 상황을 미리 확인하고 싶은 경우 에러를 발생시켜야 할 경우가 빈번히 발생한다.

이러한 에러 발생을 통해 예외 상황을 파악하고, 해당 예외를 통해 발생할 수 있는 side effect를 예방하는 작업이 필요하다.

 

이러한 에러를 일으키는 방법은 여러가지가 있지만

자주 사용하는 Assert 구문과 Raise 구문을 비교해 보고자 한다.

Assert


공식문서를 보면 너무 단순하다.

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

와 동일하다고 명시되어있다.

 

조건문이 일치하지 않을 시 raise 구문을 통해 AssertionError를 발생시켜 프로그램 동작을 멈춘다.

st = ['a', 'b', 'c']
assert len(str) == 2, "리스트의 길이가 2가 아닙니다."

assert는 True 조건만 통과시켜 주기 때문에

위 예시 코드에서는 st의 길이가 3이므로, 조건이 false 이기 때문에 AssertionError 가 발생한다.

 

그럼 raise를 살펴보자

 

raise


st = ["a", "b", "c"] 

if not len(st) == 2:
    raise AssertionError("리스트의 길이가 2가 아닙니다.")

앞서 위에 Assert 공식문서와 같이 결과가 동일하게 나왔다.

 

하지만 raise 구문에서 뒤 AssertionError 를 제거 후 다른 에러 종류를 넣어 실행하면,

st = ["a", "b", "c"]

if not len(st) == 2:
    raise ValueError

이처럼 파이썬에서 사용하고 있는 에러 키워드로 에러를 발생시킬 수 있다.

(raise + 메시지 형식도 가능하다. ex raise Exception("메시지"))

 

결론


assert 문을 사용하면 AssertionError 를 출력하면서 코드가 종료되고,

raise 문을 사용하면 AssertionError 뿐만 아니라 AttributeError, ValueError, importError  기타 다른 에러도 출력하여 코드를 종료시킬 수 있다.

 

간단한 디버그를 위해서는 assert 문을,

에러 내용을 구체적으로 명시하고자 할 땐 raise 구문을 사용하는 것이 좋아 보인다.

 

그렇다면 assert raise 중 뭐가 좋을까 ..?

* 디버깅 모드, 릴리즈 모드

   > 디버깅 모드 = 컴파일할 때 디버깅 정보를 삽입하여 디버깅을 할 수 있도록 하는 컴파일 모드

   > 릴리즈 모드 = 디버깅 정보 없이, 순수한 코드 자체의 기능만 사용하는 컴파일 모드

 

만약 assert문을 통해 디버깅 진행 시 코드를 종료시키지 않고 예외처리를 진행 시,

    st = ["a", "b", "c"]
    try:
        assert len(st) == 2, "리스트의 길이가 2이 아닙니다."
        print(st)
    except AssertionError:
        print('error 발생')

 

try: ... except AssertionError: ... 구문을 사용하여 예외처리를 진행할 수 있는데

 

코드를 배포하기 전 컴파일을 하면 assert 문은 모두 사라지지만

위 예시 except 구문 AssertionError 코드는 남아있게 된다.

 

이 처럼 assert는 간단한 디버깅 용으로 사용하는 게 좋고,

발생해서는 안 되는 예외 상황을 다른 개발자에게 명시하기 위한 주석으로 사용하기도 한다고 한다.

 

실사용에서 사용한다면 raise 구문을 사용하는 것이 좋아 보인다.

 

🎥고돌한고돌이 youtube

https://www.youtube.com/channel/UCJqvLr-GzRouSGiT235bMuw

 

고돌한고돌이 KODORRI

하고싶은거 많은 고돌이의 먹부림 일상

www.youtube.com

 

반응형

댓글