예외 처리
- 기본적인 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 구문에서 전달한 인자를 확인할 수 있다.