일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
Tags
- MacOS
- tree.fit
- 순열
- Machine Learning
- 등차수열
- barh
- 재귀함수
- matplotlib
- 스터디노트
- maplotlib
- plt
- 통계학
- Slicing
- 머신러닝
- python
- INSERT
- 기계학습
- Folium
- pandas filter
- 파이썬
- pandas
- DataFrame
- 리스트
- 조합
- 문제풀이
- SQL
- pandas 메소드
- 자료구조
- numpy
- 등비수열
Archives
- Today
- Total
코딩하는 타코야끼
[Python] 8강_예외처리 본문
728x90
반응형
1. 오류
📍 개요
- 함수나 메소드가 처리 도중 다음 명령문을 실행할 수 없는 상황
- 오류 중 처리가능한 것을 Exception(예외) 라고 한다. 그리고 그 예외를 처리하는 것을 Exception Handling 이라고 한다.
📍 오류의 종류
🌓 파이썬 문법을 어겨서 발생하는 오류
- 코드 상 100% 발생하는 오류
- 코드를 수정해 야한다.
- 보통 이런 오류는 컴파일 방식 언어의 경우 컴파일 때 에러를 내서 수정하도록 한다.
🌓 실행 환경의 문제로 발생하는 오류
- 코드상에서는 Exception의 발생여부를 확신할 수 없다.
- 만약 발생할 경우 어떻게 처리할지를 구현해야 한다.
📍Exception handling
- Exception이 발생되어 프로그램이 더이상 실행될 수 없는 상황을 처리(handling)해서 정상화 시키는. 작업을 말한다.try - except 구문을 이용해 처리한다.
🌓 try, except 구문
- try block
- Exception 발생 가능성 있는 코드와 그 코드와 연결된 코드들을 블록으로 묶는다.
- 연결된 코드란 Exception이 발생 안해야만 실행되는 코드를 말한다.
- Exception 발생 가능성 있는 코드와 그 코드와 연결된 코드들을 블록으로 묶는다.
- except block
- 발생한 Exception을 처리하는 코드 블록을 작성한다.
- try block의 코드를 실행하다 exception이 발생하면 except block이 실행된다. Exception이 발생하지 않으면 실행되지 않는다.
- try block에서 발생한 모든 Exception을 처리하는 경우 except: 로 선언한다.
- try block에서 발생한 특정 Exception만 따로 처리할 경우 except Exception클래스 이름 을 선언한다.
- 모든 Exception들은 클래스로 정의 되어 있다. 그 클래스 이름을 적어준다.
- Exception 들 별로 각각 처리할 수 있으면 이 경우 except 구문(처리구문)을 연속해서 작성하면 된다.
- try block에서 발생한 특정 Exception만 따로 처리하고 그 Exception이 왜 발생했는지 등의 정보를 사용할 경우 except Exception 클래스 이름 as 변수명 으로 선언하고 변수명을 이용해 정보를 조회한다.
- 발생한 Exception을 처리하는 코드 블록을 작성한다.
예제)
# try - except
print("프로그램 시작") # 1
try:
num = int(input()) # 2 Exception 발생가능성이 있는 코드
result = 10 // num # 3
print(result) # 4
except:
print('실행도중 문제가 발생했습니다.') # 5
print('프로그램 종료') # 6
>>>
프로그램 시작
아아아아
실행도중 문제가 발생했습니다.
프로그램 종료
- 예외 (Exception)이 발생하지 않은 경우 실행 순서
- 1 -> 2 -> 3 -> 4 -> 6
- 예외 (Exception)이 발생한 경우 실행순서 (line 2)
- 1 -> 2(X) -> 5 -> 6
# try - except
print("프로그램 시작") # 1
try:
num = int(input()) # 2 ValueError Exception 발생가능성이 있는 코드
result = 10 // num # 3 ZeroDivisionError Exception 발생가능성이 있는 코드
print(result) # 4
print(result2) # NameError Exception 발생.
# valueError Exception은 여기서 처리.
except ValueError as ve:
print('숫자가 아니어서 예외 발생', ve) # 5-1
# ZeroDivisionError Exception은 여기서 처리.
except ZeroDivisionError as ze:
print('0으로 나눌수 없습니다.', ze) # 5-2
except:
print("ValueError, ZeroDivisionError를 제외한 나머지 Exception들을 처리하는 except block")
print('프로그램 종료')
>>>
프로그램 시작
1
10
ValueError, ZeroDivisionError를 제외한 나머지 Exception들을 처리하는 except block
프로그램 종료
- line2에서 ValueError 발생시 실행 순서
- 1 -> 2(X) -> 5-1 -> 6
- line3에서 ZeroDivisionError
- 1 -> 2-> 3(X) -> 5-2 -> 6
🌓 finally 구문
- 예외 발생여부, 처리 여부와 관계없이 무조건 실행되는 코드블록
- try 구문에 반드시 실행되야 하는 코드블록을 작성할때 사용한다.
- 보통 프로그램이 외부자원과 연결해서 데이터를 주고 받는 작업을 할때 마지막 연결을 종료하는 작업을 finally 블록에 넣는다.
- finally 는 except 보다 먼저 올 수 없다.
- 구문순서
- try - except - finally
- try - except
- try - finally
- 구문순서
print('시작')
try:
print(1)
a = 10 / 2
print(2)
except NameError:
print(3)
finally:
print(4)
print('종료')
>>>
시작
1
2
4
종료
📍 Exception 발생 시키기
🌓 사용자 정의 Exception 클래스 구현
- 파이썬은 Exception 상황을 클래스로 정의해 사용한다.
- Exception이 발생하는 상황과 관련된 attribute들과 메소드들을 정의한 클래스
- 구현
- Exception 클래스를 상속받는다.
- 클래스 이름은 Exception 상황을 설명할 수 있는 이름을 준다.
# 월에 1 ~ 12 이외의 값을 대입하려고 할때 발생시킬 Exception
class InvalidMonthException(Exception):
def __init__(self, invalid_month):
"""
month에 저장하려는 잘못된 입력값을 받아서 attribute로 저장.
"""
self.invalid_month = invalid_month
def __str__(self):
return f"{self.invalid_month}는 사용할 수 없는 달 입니다. 1 ~ 12를 넣으세요"
- "def str(self):" 값 이후 return 값 입력 실수 조심!!!
🌓 Exception 발생시키기
- 함수나 메소드가 더이상 작업을 진행 할 수 없는 조건이 되면 Exception을 강제로 발생시킨다.
- Call Stack Mechanism
- 발생한 Exception은 처리를 하지 않으면 caller에게 전달된다.
- 발생한 Exception에 대한 처리가 모든 caller에서 안되면 결국 파이썬 실행환경까지 전달되어 프로그램은 비정상적으로 종료 되게 된다.
- 발생한 Exception은 처리를 하지 않으면 caller에게 전달된다.
🌓 raise 구문
- Exception을 강제로 발생시킨다.
- 업무 규칙을 어겼거나 다음 명령문을 실행할 수 없는 조건이 되면 진행을 멈추고 caller로 요청에게 작업을 처리 못했음을 알리며 돌아가도록 할때 exception을 발생시킨다.
- 구문)
- raise와 return
- 함수나 메소드에서 return과 raise 구문이 실행되면 모두 caller로 돌아간다.
- return은 정상적으로 끝나서 돌아가는 의미이다. 그래서 처리결과가 있으면 그 값을 가지고 돌아간다.
- caller는 그 다음작업을 이어서 하면 된다.
- raise는 실행도중 문제(Exception)가 생겨 비정상적으로 끝나서 돌아가는 의미이다. 그래서 비정상적인 상황 정보를 가지는 Exception객체를 반환값으로 가지고 돌아간다.
- caller는 try - except구문으로 발생한 exception을 처리하여 프로그램을 정상화 하거나 자신도 caller에게 exception을 발생시키는 처리를 한다.
# 달을 처리하는 함수
def save_month(month):
if month < 1 or month > 12: # 잘못된 월이어서 저장할 수 없는 상황 이라면
raise InvalidMonthException(month) # InvalidMonthException 발생시킨다.
print(f'{month}월을 저장 했습니다.')
def save_day():
print('날짜 저장')
try:
save_month(11)
save_day() # save_month()가 정상처리된 다음에 실행되야 한다.
except InvalidMonthException as e: # e:변수 - raise된 Exception객체가 대입.
print('저장 실패했습니다.',e)
print("종료")
>>>
11월을 저장 했습니다.
날짜 저장
종료
🌓 예제)
- 주문처리 예제입니다.
# class 선언.
class NotEnoughStockException(Exception):
def __init__(self, stock_amount, order_amount):
#재고량, 주문량을 attribute로 저장
self.stock_amount = stock_amount
self.order_amount = order_amount
def __str__(self):
return f'재고량 보다 많은 개수를 주문했습니다. 재고량: {self.stock_amount}, 주문량: {self.order_amount}'
# 주문처리 함수 선언.
def order(order_amount):
"""
주문처리함수
[Parameter]:
order_amount: int - 주문개수
[Return]:
[Raise]:
NotEnoughStockException- 주문량보다 재고량이 적으면 발생하는 Exception
"""
print("재고량 조회")
stock_amount = 10
if stock_amount < order_amount:
raise NotEnoughStockException(stock_amount, order_amount)
print('주문처리')
print('주문정보 저장')
stock_amount -= order_amount
print('주문완료. 남은 재고량:', stock_amount)
# main 구문.
try:
order(12)
except NotEnoughStockException as e:
print('전체 주문 실패', e)
order(e.stock_amount)
반응형
'[T.I.L] : Today I Learned > Python' 카테고리의 다른 글
[Python] 9-2강_입출력 (2) | 2023.04.09 |
---|---|
[Python] 9-1강_Path (0) | 2023.04.09 |
[Python] 7강_패키지 모듈 import (0) | 2023.04.05 |
[Python] 6강_객체지향 프로그 (0) | 2023.04.05 |
[Python] 5강_함수 (0) | 2023.04.04 |