파이썬으로 개발을 진행하다 보면
코드 중간에 예외 상황을 미리 확인하고 싶은 경우 에러를 발생시켜야 할 경우가 빈번히 발생한다.
이러한 에러 발생을 통해 예외 상황을 파악하고, 해당 예외를 통해 발생할 수 있는 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
'coding 📟 > python 💻' 카테고리의 다른 글
[Python] 가상환경 pyenv (1) | 2022.05.13 |
---|---|
[Python] 파이썬 가상환경이란? (1) | 2022.05.13 |
[Python] 리스트 원소 랜덤 추출 (0) | 2022.03.08 |
[Python] Iterator(이터레이터) Iterable(이터러블) 정리 비교 (0) | 2022.03.08 |
[Python] 파이썬 리스트, 배열 최대값 최소/최대 값 찾기 - min/max 함수 (0) | 2022.03.08 |
댓글