현실에서 어떤 사건이 발생하면 '누가, 언제, 어디서'라는 정보가 생긴다. 프로그래밍 언어도 예외가 발생하면 예외와 관련된 정보가 생성된다. 예외 정보는 **예외 객체(exception object)**에 저장된다.
예외 객체는 다음과 같은 형태로 사용한다.
try:
예외가 발생할 가능성이 있는 구문
except 예외의 종류 as 예외 객체를 활용할 변수 이름:
예외가 발생했을 때 실행할 구문
예외 객체
try:
number = int(input('정수 입력 > '))
print('원의 반지름 :',number )
print('원의 둘레 :', 2*3.14*number )
print('원의 면적 :', 3.14* number* number)
except Exception as exception: # Exception : 모든 예외 사항이라는 키워드
# 예외 객체를 출력해 봅니다. # exception : 변수
print('type(exception) :', type(exception))
print('exception :', exception)
정수 입력 > 7세
type(exception) : <class 'ValueError'>
exception : invalid literal for int() with base 10: '7세’
부모 : Exception
객체 : ValueError, IndexError…
예외 구분하기
예외 객체를 사용하면 except 구문을 if 조건문처럼 사용해서 예외를 구분할 수 있다.
try:
예외가 발생할 수 있는 구문
except 예외의 종류A:
예외A가 발생했을 때 실행할 구문
except 예외의 종류B:
예외B가 발생했을 때 실행할 구문
except 예외의 종류C:
예외C가 발생했을 때 실해할 구문
lst = [1, 2, 3, 4, 5]
try:
idx = int( input('양의 정수 입력(범위는 0부터 {})> '.format(len(lst)-1)))
print('{}번째 요소 : {}'.format(idx, lst[idx]))
except ValueError:
print('정수를 입력해 주세요.')
except IndexError:
print('리스트의 인덱스 범위를 벗어났습니다.')
양의 정수 입력(범위는 0부터 4)> 2
2번째 요소 : 3
예외 구분 구문과 예외 객체
예외를 구분할 때 각각의 except 구문 뒤에 예외 객체를 붙여 활용할 수도 있다. 마찬가지로 as 키워드를 사용하면 된다.
lst = [1, 2, 3, 4, 5]
try:
idx = int( input('양의 정수 입력(범위는 0부터 {})> '.format(len(lst)-1)))
print('{}번째 요소 : {}'.format(idx, lst[idx]))
except ValueError as exception:
print('정수를 입력해 주세요.')
print('exception :', exception)
except IndexError as exception:
print('리스트의 인덱스 범위를 벗어났습니다.')
print('exception :', exception)
양의 정수 입력(범위는 0부터 4)> 10
리스트의 인덱스 범위를 벗어났습니다.
exception : list index out of range
모든 예외 잡기
except 구문으로 예외를 구분하면 if, elif, else 조건문처럼 차례대로 오류를 검사하면서 오류의 타입을 알수 있다. 만약 except 구문으로 나눠 놓은 예외에 해당되지 않는 예외라면 예외 발생으로 프로그램은 종료된다.
lst = [1, 2, 3, 4, 5]
try:
idx = int( input('양의 정수 입력(범위는 0부터 {}) : '.format(len(lst)-1)))
print(idx + '번째 요소 : {}'.format(lst[idx])) # 일부러 TypeError 발생시킴
except ValueError as exception:
print('정수를 입력해 주세요.')
print('exception :', exception)
except IndexError as exception:
print('리스트의 인덱스 범위를 벗어났습니다.')
print('exception :', exception)
TypeError로 인해 프로그램이 실행 도중 종료되었다. 인위적으로 TypeError를 발생시켰기 때문에 우리는 TypeError가 발생할 것을 예상할 수 있었지만 except 구문으로 예외 처리를 설정해 놓지 않은 예외가 발생할 수 있다. 그래서 프로그램이 실행 도중 종료될 수 있는데 이를 막기 위해 코드를 수정해 보겠다.
lst = [1, 2, 3, 4, 5]
try:
idx = int( input('양의 정수 입력(범위는 0부터 {})> '.format(len(lst)-1)))
print(idx + '번째 요소 : {}'.format(lst[idx])) # 일부러 TypeError 발생시킴
except ValueError as exception:
print('정수를 입력해 주세요.')
print('exception :', exception)
except IndexError as exception:
print('리스트의 인덱스 범위를 벗어났습니다.')
print('exception :', exception)
except Exception as exception:
print('예상하지 못한 예외 상활 발생')
print(type(exception), exception)
양의 정수 입력(범위는 0부터 4)> 2
예상하지 못한 예외 상활 발생
<class 'TypeError'> unsupported operand type(s) for +: 'int' and 'str’
—> indexerror가 발생했을때 IndexError, valueerror 발생했을때 ValueError, 그 외에 모든 error 발생 시 Exception이 처리한다.
⇒ Exception이 제일 앞에 위치하면 모든 에러 다 Exception이 처리하기 때문에 제대로 error를 잡고 싶다면 Exception이 제일 뒤에 위치하면 된다.
raise 구문
프로그램이 실행 도중 강제 종료되는 것을 막기 위해 예외는 꼭 처리되어야 한다. 하지만 프로그램을 개발하는 동안에는 정말 의도적으로 예외 상황을 만들기도 한다. '아직 구현하지 않은 부분이 있는데 까먹을 수 있으니 확실하게 문제(에러)가 생기게 만들자. 그래서 나중에 이 부분을 코딩 해야한다는 것을 기억하게' 또는 '이 상태로 프로그램이 더 진행되면 프로그램이 이 시점에 종료하는 것 보다 더 큰 문제를 이르킬 수 있으니 여기서 강제 종료 시키자' 등의 이유에서 의도적으로 예외를 발생 시키게 된다.
number = input('정수 입력 > ')
number = int( number )
if number > 0:
# 양수일 때, 아직 미구현
raise NotImplementedError
else:
#음수 일때, 아직 미구현
raise NotImplementedError
아직 구현되지 않은 부분이므로 일부러 예외를 발생시켜 프로그램이 종료되게 만들어서 미 구현된 파트가 여기 있다는 것을 잊어버리지 않게 하는 것이다. 이때 사용한 raise 키워드가 예외를 인위적으로 발생시키는 명령이다.
raise 예외_객체
'빅데이터 분석가 양성과정 > Python' 카테고리의 다른 글
Ch07-2 모듈 / 외부 모듈 (1) | 2024.07.05 |
---|---|
Ch07-1 모듈 / 표준 모듈 (0) | 2024.07.05 |
Ch06-1 예외처리 / 구문 오류와 예외 (0) | 2024.07.05 |
Ch05-2 함수 / 함수의 활용 (0) | 2024.07.05 |
Ch05-1 함수 / 함수 만들기 (0) | 2024.07.05 |