오류 종류
→ 파이썬 문법 어김으로 발생하는 오류
→ 실행 환경 문제로 발생하는 오류
: Exception이 발생되어 프로그램이 더이상 실행될 수 없는 상황을 처리(handling)해서 정상화 시키는 작업
📍 try, except 구문try:
Exception 발생가능한 코드 블록
except [Exception클래스 이름 [as 변수]] :
처리 코드
# [ ] 안에는 생략 가능
try block
⇒ exception 발생 가능성 있는 코드 + 그 코드와 연결된 코드( = exception 발생하지 않을 시 실행되는 코드)
except block
⇒ exception이 발생해야만 실행
except:
: try block에서 발생한 모든 Exception을 처리하는 경우
except Exception클래스 이름
: try block에서 발생한 특정 Exception만 따로 처리할 경우
except Exception 클래스 이름 as 변수명
: try block에서 발생한 특정 Exception이 왜 발생했는지 등의 정보를 사용할 경우 변수명을 이용해 정보 조
Exception 들 별로 각각 처리할 수 있으면 이 경우 except 구문(처리 구문)을 연속해서 작성
ex) try - except 구문 사용 예시
print("start program") #1
try:
num = int(input("정수:")) #2 exception 발생 가능성 있는 코드
result = 10 // num #3 #2가 실행이 안되면 차피 #3,#4 모두 실행 불가
print("result:", result) #4
except ValueError: # ValueError를 처리하는 BLOCK
print("정수로 변환 못함. - ValueError 발생") # EH1
except ZeroDivisionError:
print("0으로는 못나눔. - ZeroDivisionError 발생") # EH2
except: # 두 exception을 제외한 나머지 excepttion을 처리
print("실행도중 문제 발생, 일단 처리 완료") # EH3
print("end program ==> next 작업") #5
# try에서 ValueError 발생 (2): 1, EH1, 5
# try에서 ZeroDivisionError 발생(3): 1, 2, EH2, 5
# try에서 ValueError, ZeroDivisionError를 제외한 exception 발생(NameError):
# 1, 2, 3, 4, EH3, 5
: 예외 발생여부, 처리 여부와 관계없이 무조건 실행되는 코드블록
: try 구문에 반드시 실행되야 하는 코드블록을 작성할때 사용
구문순서
- try - except - finally
- try - except
- try - finally
⇒ finally 는 except 보다 먼저 올 수 없음
→ finally block은 입출력 관련해서 자주 쓰임
ex)
try:
a = int(input())
except:
print("예외 발생") #if-else 같이 except이 맞으면 실행, 아니면 아래 else 실행
else:
print(a + 10)
finally:
print("무조건 실행 할 코드")
사용자 정의 Exception 클래스 구현
Exception
클래스를 상속받는다.→ 함수나 메소드가 더 이상 작업을 진행 할 수 없는 조건이 되면 Exception을 강제로 발생
Call Stack Mechanism
- 발생한 Exception은 처리를 하지 않으면 caller에게 전달된다.
- 발생한 Exception에 대한 처리가 모든 caller에서 안되면 결국 파이썬 실행환경까지 전달되어 프로그램은 비정상적으로 종료 되게 된다.
: Exception을 강제로 발생
(업무 규칙을 어겼거나 다음 명령문을 실행할 수 없는 조건이 되었을 때)
raise Exception객체
raise와 return
- 함수나 메소드에서 return과 raise 구문이 실행되면 모두 caller로 돌아감
- return은 정상적으로 끝나서 돌아가는 의미이므로 처리 결과가 있으면 그 값을 가지고 돌아감
⇒ caller는 그 다음 작업을 이어서 하면 됨- raise는 실행 도중 문제(Exception)가 생겨 비정상적으로 끝나서 돌아가는 의미 의므로 비정상적인 상황 정보를 가지는 Exception객체를 반환 값으로 가지고 돌아감
⇒ caller는 try - except구문으로 발생한 exception을 처리하여 프로그램을 정상화 하거나 자신도 caller에게 exception을 발생 시키는 처리를 함