예외처리
오류로 인한 프로그램의 비정상적인 종료를 예방하는 작업
문법)
try:
예외가 발생할 수도 있는 코드들....
except:
예외가 발생했을 때 처리하는 코드들....
else: # except의 반대 상황
예외가 발생하지 않았을 때 실행할 코드들....
finally:
예외 발생과 상관없이 항상 실행할 코드들....
except 블록 활용
except 블록은 여러 개 넣을 수 있음.
'except 에러명:' 으로 각 예외에 따른 except 블록을 작성할 수 있음.
'except 에러명 as 식별자:' 식별자에 에러 메시지가 저장됨. 에러 메시지를 출력할 때 사용.
'except Exception:' - 모든 에러 처리.
'except 에러명'으로 지정한 특정 에러를 제외한 나머지 에러를 처리하는 형식
'except:'만 사용해도 모든 에러를 처리.
예외사항 발상시키기 - raise Exception('메세지')
오류가 아닌 상황에서 메시지 전송을 위해 사용하는 형태
활용 예)
if 조건:
raise Exception('메시지1')
elif 조건:
raise Exception('메시지2')
else:
raise Exception('메시지3')
def nth_multiple(x, y): # (6, 3)
if x % y != 0:
raise Exception(str(x) + '는/은 ' + str(y) + '의 배수가 아닙니다.' )
print(f'{x}는/은 {y}의 배수입니다')
a, b = map(int, input('두 수 입력 : ').split())
try:
nth_multiple(a, b)
except Exception as e:
print(e)
파이썬 예외사항
# 일반적인 상황
x, y = map(int, input('두 숫자 입력 : ').split())
z = x / y
print(f'{x} / {y} = {z}')
# 비교 처리
x, y = map(int, input('두 숫자 입력 : ').split())
if y == 0:
print('안됩니다!')
else:
z = x / y
print(f'{x} / {y} = {z}')
# 예외 처리
try:
x, y = map(int, input('두 숫자 입력 : ').split())
z = x / y
print(f'{x} / {y} = {z}')
except:
print('0으로 나눌 수 없습니다.')
# 다른 예외사항이 또 발생한 경우
a = [10, 20, 30]
print(a)
try:
idx, x = map(int, input('순번과 나눌 숫자 입력 : ').split())
y = a[idx]/x
print(f'{a[idx]} / {x} = {y}')
except ZeroDivisionError: # x가 0일 때만 나와야 함.
print('0으로 나눌 수 없습니다.')
except IndexError:
print(f'0부터 {len(a)-1}까지만 순번을 입력하세요.')
# 에러 문구
a = [10, 20, 30]
print(a)
try:
idx, x = map(int, input('순번과 나눌 숫자 입력 : ').split())
y = a[idx]/x
print(f'{a[idx]} / {x} = {y}')
except ZeroDivisionError as ze: # x가 0일 때만 나와야 함.
print('0으로 나눌 수 없습니다.', ze)
except IndexError as ie:
print(f'0부터 {len(a)-1}까지만 순번을 입력하세요.', ie)
# 다른 코드들...
try:
l = int(input('숫자 : '))
m = 10 / l
except:
print('0으로 나눌 수 없습니다.')
else:
print(f'결과 : {m}')
try:
l = int(input('숫자 : '))
m = 10 / l
except:
print('0으로 나눌 수 없습니다.')
else:
print(f'결과 : {m}')
finally: # 항상 실행
print('처리가 완료되었습니다.')
물리적인 상황은 코드로 예방할 수 있는 상황이 아님(네트워크 통신기기가 망가진 경우)
ZeroDivisionError: division by zero
모듈과 패키지 만들기
1. 모듈만들기
모듈 : 특정 목적(기능)을 처리할 수 있는 변수, 함수, 클래스를 하나의 파일로 모아 놓은 것
import로 가져와서 사용
파일명 square2
# 변수
base = 2
# 함수
def square(n):
return base ** n
class InfoClass:
def __init__(self, a, b):
self.a = a
self.b = b
def show(self):
print(f'{self.a}, {self.b}')
다른 파일에서 불러오기
# import square2
import square2 as s2
# from square2 import *
print(s2.base)
r = s2.square(3)
print(f'2^3 = {r}')
ins = s2.InfoClass(10, 20)
ins.show()
2. 패키지 만들기
패키지 : 모듈을 모아 놓은 폴더
패키지에 __inti__.py 파일을 작성하면, 폴더를 패키지로 인식하게 된다.
(3.3 버전 이후에는 __inti__.py 없이도 패키지로 인식하지만, 하위 버전과의 호환을 위해 작성하는 것을 권장함)
__inti__.py 파일에는 아무것도 작성하지 않아도 됨.
'improt 패키지.모듈'로 사용
__init__.py 파일
# 아무것도 작성하지 않아도 됨
# 패키지 안에 하나 import 할 때
** 첫번째
import mycal.operator
x = mycal.operator.add(10, 20)
print(x)
** 두번째
import mycal.operator as op
x = op.add(10, 20)
print(x)
__init__.py 파일
# 여러개 import 해야 할 때, . 은 같은 폴더를 나타냄
from . import operator
from . import operator2
# 패키지 안에 여러 개 import 할 때
** 첫번째
from mycal.operator import *
from mycal.operator2 import *
x = add(10, 20)
print(x)
y = mul(3, 5)
print(y)
** 두번째
import mycal
x = mycal.operator.add(10, 20)
print(x)
y = mycal.operator2.mul(3, 5)
print(y)
** 세번째
__init__.py 파일
from .operator import *
from .operator2 import *
from mycal import *
x = add(10, 20)
print(x)
y = mul(3, 5)
print(y)
'공부기록 > Python' 카테고리의 다른 글
6월 15일 python - Web2 (0) | 2023.06.15 |
---|---|
6월 14일 (2) python - Web (0) | 2023.06.14 |
6월 13일 python - 클래스 (0) | 2023.06.13 |
6월 12일 (2) python - 모듈 (0) | 2023.06.12 |
6월 12일 (1) python - 함수 (1) | 2023.06.12 |