Gidhub BE Developer

기본 예외처리, raise 구문

2018-02-08
goodGid

예외 처리

  • 기본적인 try 구문의 사용법은 다음과 같다.
try:
    <예외 발생 가능성이 있는 문장>
except 예외 종류:
    <예외 처리 문장>
except ( 예외 1, 예외 2 ):
    <예외 처리 문장>
except 예외 as 인자:
    <예외 처리 문장>
else:
    <예외가 발생하지 않은 경우, 수행할 문장>
finally:
    <예외 발생 유무에 상관없이 try 블록 이후 수행할 문장>
try:
    c = divide(5,"af")

except TypeError:
    print("모든 인자는 숫자여야 합니다.")

except TypeError as e:
    print("Error : ", e.args[0])        # 전달되는 예외 인스턴스 객체를 e로 받아서 사용

except ( ZeroDivisionError, OverflowError, FloatingPointError ): # 명시된 에러를 모두 처리
    print("수치 연산 관련 에러입니다. ")

else:
    print("Result : {0}" .format(c))

finally:
    print("항상 finally 블록은 수행됩니다.")


raise 구문

  • 사용자가 의도적으로 예외를 발생시켜야 하는 경우가 있다.

  • 이러한 경우 raise 구문을 사용할 수 있다.

  • raise 구문의 형식은 아래와 같다.

1. raise [Exception]            # 해당 예외를 발생시킨다.
2. raise [Exception(data)]      # 예외 발생 시 관련 데이터를 전달한다.
3. raise                        # 발생된 예외를 상위로 전달한다.
  • 사용자 정의 예외를 생성하는 경우, 반드시 내장 클래스인 Exception을 상속바다 정의해야한다.

def RaiseErrorFunc():
    raise NameError         # 내장 예외인 NameError를 발생

try:
    RaiseErrorFunc()

except :
    print("NameErro is Catched.")


NameErro is Catched.


  • 예외를 상위로 전달(Propagation)하는 예제이다.
def RaiseErrorFunc():
    raise NameError("NameError의 인자")
def PropagateError():
    try:
        RaiseErrorFunc()
    except :
        print("에러 전달 이전에 먼저 이 메시지가 출력됩니다.")
        raise           # 발생한 에러를 상위로 전달

PropagateError()

에러 전달 이전에 먼저  메시지가 출력됩니다.
Traceback (most recent call last):
  File "/Users/gy8971/Desktop/gid/1.Programming/Python/init.py", line 11, in <module>
    PropagateError()
  File "/Users/gy8971/Desktop/gid/1.Programming/Python/init.py", line 5, in PropagateError
    RaiseErrorFunc()
  File "/Users/gy8971/Desktop/gid/1.Programming/Python/init.py", line 2, in RaiseErrorFunc
    raise NameError("NameError의 인자")
NameError: NameError 인자

  • RaiseErrorFunc() 함수에 의해 NameError 에러가 발생하며,
    처리하는 부분이 없기 때문에 발생한 에러는 PropagateError() 함수로 전달된다.

  • 예외를 받은 PropagateError() 함수에서는 화면에 메시지를 출력하고 받은 예외를 그대로 상위로 전달한다.

  • 전달된 예외는 처리하는 부분이 없기 때문에 출력 결과에서 확인할 수 있듯이 프롬포트에 에러를 출력한다.

  • 출력 결과에서 예외가 발생할 때의 콜 스택 정보와 raise 구문에서 전달한 인자를 확인할 수 있다.


Comments

Content