오뚝이개발자

[Python] assert, raise 본문

Language/파이썬

[Python] assert, raise

땅어 2021. 9. 25. 14:43
728x90
300x250

 

 

assert


assert는 뒤에 오는 조건이 False면 AssertionError를 발생시킨다.

>>> a = 3
>>> assert a == 2

#결과
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AssertionError

 

다음과 같이 assert 조건, "에러문"의 형식으로 사용할 수도 있다.

def test(t):
    assert type(t) is int, '정수 아닌 값이 있네'

for i in lists:
    test(i)
#결과
AssertionError: 정수 아닌 값이 있네

 

즉, assert는 가정설정문이라고 해서 특정 값이나 값의 범위를 보장하기 위해 프로그램 중간중간에 사용한다. 예컨대, 어떤 함수는 정수값만을 input으로 받아야 한다거나, return값이 정수여야만 하는 경우가 있을 수 있다. 이러한 경우에 특정 조건을 보장하기 위해 사용한다.

 

raise


raise는 강제로 예외를 발생시킬 수 있다. 예컨대, 어떠한 경우에 아래 로직을 처리하지 않고 에러로 빼서 처리하고 싶을 때 주로 사용한다.(내가 일을 할때도 그랬고, 실제로 현업에선 이 raise를 많이 사용한다.)

while 1:
    a = input("Enter number : ")
    try:
        if int(a) == 1:
            raise ValueError
        elif int(a) == 2:
            raise TypeError
        elif int(a) == 3:
            raise NameError
        print("Number you entered is", float(a))
    except ValueError:
        print("1 entered")
    except TypeError:
        print("2 entered")
    except NameError:
        print("3 entered")
    else:
        break
    finally:
        print("-------------------")

위의 예에선 입력받은 값이 1,2,3일 때, 각각 ValueError, TypeError, NameError를 발생시켰다. 보통 이렇게 raise는 try...except문과 함께 쓰인다. 위 예제를 실행한 모습은 아래와 같다.

Enter number : 1
1 entered
-------------------
Enter number : 2
2 entered
-------------------
Enter number : 3
3 entered
-------------------
Enter number : 4
Number you entered is 4.0
-------------------

 

그런데 이렇게 이미 deserved된 에러가 아니라 자신이 만든 특정 상황의 에러가 발생한 경우 별도 처리를 하기를 원할 수도 있다. 이러한 경우 아래와 같이 직접 Error를 만들어 조건을 줄 수 있다.

class InputOne(Exception):
    def __init__(self):
        super().__init__("1 entered")

class InputTwo(Exception):
    def __init__(self):
        super().__init__("2 entered")

class InputThree(Exception):
    def __init__(self):
        super().__init__("3 entered")

while 1:
    a = input("Enter number : ")
    try:
        if int(a) == 1:
            raise InputOne
        elif int(a) == 2:
            raise InputTwo
        elif int(a) == 3:
            raise InputThree
        print("Number you entered is", float(a))
    except Exception as e:
        print("Exception occured : ", e)
    else:
        break
    finally:
        print("-------------------")

위 예제를 실행한 결과는 아래와 같다.

Enter number : 1
Exception occured :  1 entered
-------------------
Enter number : 2
Exception occured :  2 entered
-------------------
Enter number : 3
Exception occured :  3 entered
-------------------
Enter number : 4
Number you entered is 4.0
-------------------

 

assert는 주로 값이 어떠한 조건을 만족해야 한다는 것을 보장하기 위해(조건을 만족하지 못할 경우 강제 종료시킨다) 사용한다. 반면, raise는 try...except문과 함께 사용해서 예외 상황에 대한 별도의 처리를 하도록 한다.

 

References

 

 

 

728x90
300x250
Comments