21.[python중급 문제풀이]예외처리(6.15)

Sooyeon·2023년 6월 15일

Python

목록 보기
21/22
post-thumbnail

[Python 중급 문제풀이]
예외처리(01-05)

예외처리(01)


사용자가 입력한 숫자를 이용해서 산술연산 결과를 출력하는 모듈을 만들되, 예상하는 예외에 대한 예외처리 코드를 작성해 보자.


def add(n1,n2):
    print('덧셈 연산')
    try:
            n1=float(n1)
    except:
            print('첫 번째 피연산자는 숫자가 아닙니다.')
            return
    try:
            n2=float(n2)
    except:
            print('두 번째 피연산자는 숫자가 아닙니다.')
            return

    print(f'{n1} + {n2} = {n1+n2}')

def sub(n1,n2):
    print('뺄셈 연산')
    try:
        n1 = float(n1)
    except:
        print('첫 번째 피연산자는 숫자가 아닙니다.')
        return
    try:
        n2 = float(n2)
    except:
        print('두 번째 피연산자는 숫자가 아닙니다.')
        return
    print(f'{n1} - {n2} = {n1-n2}')

def mul(n1, n2):
    print('곱셈 연산')
    try:
        n1 = float(n1)
    except:
        print('첫 번째 피연산자는 숫자가 아닙니다.')
        return
    try:
        n2 = float(n2)
    except:
        print('두 번째 피연산자는 숫자가 아닙니다.')
        return
    print(f'{n1} * {n2} = {n1 * n2}')

def div(n1, n2):
    print('나눗셈 연산')
    try:
        n1 = float(n1)
    except:
        print('첫 번째 피연산자는 숫자가 아닙니다.')
        return
    try:
        n2 = float(n2)
    except:
        print('두 번째 피연산자는 숫자가 아닙니다.')
        return
    if n2==0:
        print('0으로 나눌 수 없습니다.')
        return

    print(f'{n1} / {n2} = {n1 / n2}')

def mod(n1, n2):
    print('나머지 연산')
    try:
        n1 = float(n1)
    except:
        print('첫 번째 피연산자는 숫자가 아닙니다.')
        return
    try:
        n2 = float(n2)
    except:
        print('두 번째 피연산자는 숫자가 아닙니다.')
        return
    if n2==0:
        print('0으로 나눌 수 없습니다.')
        return
    print(f'{n1} % {n2} = {n1 % n2}')

def flo(n1, n2):
    print('몫 연산')
    try:
        n1 = float(n1)
    except:
        print('첫 번째 피연산자는 숫자가 아닙니다.')
        return
    try:
        n2 = float(n2)
    except:
        print('두 번째 피연산자는 숫자가 아닙니다.')
        return
    if n2==0:
        print('0으로 나눌 수 없습니다.')
        return
    print(f'{n1} // {n2} = {n1 // n2}')

def exp(n1,n2):
    print('거듭제곱 연산')
    try:
        n1 = float(n1)
    except:
        print('첫 번째 피연산자는 숫자가 아닙니다.')
        return
    try:
        n2 = float(n2)
    except:
        print('두 번째 피연산자는 숫자가 아닙니다.')
        return
    print(f'{n1} **{n2} = {n1 ** n2}')

첫 번째 피연산자 입력: 10
두 번째 피연산자 입력: 0
덧셈 연산
10.0 + 0.0 = 10.0
뺄셈 연산
10.0 - 0.0 = 10.0
곱셈 연산
10.0 * 0.0 = 0.0
나눗셈 연산
0으로 나눌 수 없습니다.
나머지 연산
0으로 나눌 수 없습니다.
몫 연산
0으로 나눌 수 없습니다.
거듭제곱 연산
10.0 **0.0 = 1.0

예외처리(02)


1부터 1000까지의 소수인 난수 10개를 생성하되, 소수가 아니면 사용자 예외가 발생하도록 프로그램을 만들어보자.


class NotPrimeException(Exception):
    def __init__(self,n):
        super().__init__(f'{n} is not prime number')

class PrimeException(Exception):
    def __init__(self,n):
        super().__init__(f'{n} is prime number')

def isPrime(number):
    flag=True
    for n in range(2,number):
        if number % n==0:
            flag=False
            break
    if flag==False:
        raise NotPrimeException(number)
    else:
        raise PrimeException(number)

import random
import randomNum as pm

primeNumber=[]

n=0
while n<10:

    rn=random.randint(2,1000)
    if rn not in primeNumber:

        try:
                pm.isPrime(rn)

        except pm.NotPrimeException as e:
            print(e)
            continue
        except pm.PrimeException as e :
            print(e)
            primeNumber.append(rn)

    else:
        print(f'{rn} is overlap number.')
        continue

    n+=1

print(f'PrimeNumbers: {primeNumber}')
191 is prime number
583 is not prime number
603 is not prime number
413 is not prime number
842 is not prime number
422 is not prime number
974 is not prime number
938 is not prime number
577 is prime number
271 is prime number
302 is not prime number
329 is not prime number
757 is prime number
151 is prime number
214 is not prime number
86 is not prime number
711 is not prime number
504 is not prime number
573 is not prime number
163 is prime number
813 is not prime number
436 is not prime number
235 is not prime number
695 is not prime number
213 is not prime number
106 is not prime number
912 is not prime number
972 is not prime number
966 is not prime number
301 is not prime number
871 is not prime number
939 is not prime number
506 is not prime number
923 is not prime number
41 is prime number
198 is not prime number
696 is not prime number
677 is prime number
290 is not prime number
164 is not prime number
77 is not prime number
271 is overlap number.
407 is not prime number
418 is not prime number
990 is not prime number
386 is not prime number
262 is not prime number
888 is not prime number
528 is not prime number
550 is not prime number
633 is not prime number
743 is prime number
902 is not prime number
159 is not prime number
208 is not prime number
384 is not prime number
46 is not prime number
357 is not prime number
360 is not prime number
901 is not prime number
520 is not prime number
753 is not prime number
510 is not prime number
175 is not prime number
5 is prime number
PrimeNumbers: [191, 577, 271, 757, 151, 163, 41, 677, 743, 5]

예외처리(03)


상품 구매에 따른 ‘총 구매 금액’을 출력하되, 다음과 같이 개수가 잘 못 입력된 경우 별도로 출력하도록 프로그램을 만들어보자.

g1price = 1200; g2price = 1000; g3price = 800
g4price = 2000; g5price = 900

def formatedNumber(n):
    return format(n, ',')

def calculate(*gcs):

    gcsDic = {}
    againCntInput = {}

    for idx, gc in enumerate(gcs):
        try:
            gcsDic[f'g{idx+1}'] = int(gc)
        except Exception as e:
            againCntInput[f'g{idx+1}'] = gc
            print(e)

    totalPrice = 0
    for g in gcsDic.keys():
        totalPrice += globals()[f'{g}price'] * gcsDic[g]

    print('---------------------------')
    print(f'총 구매 금액: {formatedNumber(totalPrice)}원')
    print('-------- 미결제 항목 --------')
    for g in againCntInput.keys():
        print(f'상품: {g},\t 구매 개수: {againCntInput[g]}')
    print('---------------------------')
import d as cp

g1Cnt=input('goods1 구매 개수: ')
g2Cnt=input('goods2 구매 개수: ')
g3Cnt=input('goods3 구매 개수: ')
g4Cnt=input('goods4 구매 개수: ')
g5Cnt=input('goods5 구매 개수: ')

cp.calculate(g1Cnt,g2Cnt,g3Cnt,g4Cnt,g5Cnt)
goods1 구매 개수: 한개
goods2 구매 개수: 3
goods3 구매 개수: 1
goods4 구매 개수: 
goods5 구매 개수: 2
invalid literal for int() with base 10: '한개'
invalid literal for int() with base 10: ''
---------------------------
총 구매 금액: 5,600-------- 미결제 항목 --------
상품: g1,	 구매 개수: 한개
상품: g4,	 구매 개수: 
---------------------------

예외처리(04)


회원가입 프로그램을 만들되 입력하지 않은 항목이 있는 경우 에러 메시지를 출력하는 프로그램을 만들어보자.



class EmptyDataException(Exception):

    def __init__(self,i):
        super().__init__(f'{i} is empty!')

def checkInputData(n,m,p,a,ph):

    if n==' ':
        raise EmptyDataException('name')
    elif m==' ':
        raise EmptyDataException('mail')
    elif p==' ':
        raise EmptyDataException('password')
    elif a==' ':
        raise EmptyDataException('address')
    elif ph==' ':
        raise EmptyDataException('phone')
    else:
        return

class RegisterMember():

        def __init__(self,n,m,p,a,ph):
            self.m_name=n
            self.m_mail=m
            self.m_pw=p
            self.m_addr=a
            self.m_phone=ph

        def printMemberInfo(self):
            print(f'm_name: {self.m_name}')
            print(f'm_mail: {self.m_mail}')
            print(f'm_pw: {self.m_pw}')
            print(f'm_addr: {self.m_addr}')
            print(f'm_phone: {self.m_phone}')

import  memeber as mem

m_name = input('이름 입력: ')
m_mail = input('메일 주소 입력: ')
m_pw = input('비밀번호 입력: ')
m_addr = input('주소 입력: ')
m_phone = input('연락처 입력: ')

try:
    mem.checkInputData(m_name, m_mail, m_pw, m_addr, m_phone)
    newMember = mem.RegisterMember(m_name, m_mail, m_pw, m_addr, m_phone)
    newMember.printMemberInfo()

except mem.EmptyDataException as e:
    print(e)

이름 입력: hong gil dong
메일 주소 입력: gildong@gamil.com
비밀번호 입력: 1234
주소 입력: korea seoul
연락처 입력: 010-134-5678
m_name: hong gil dong
m_mail: gildong@gamil.com
m_pw: 1234
m_addr: korea seoul
m_phone: 010-134-5678

예외처리(05)


다음과 같은 은행 계좌 계설 및 입/출금 프로그램을 만들어 보자.

import random

class PrivateBank:

    def __init__(self, bank, account_name):
        self.bank = bank
        self.account_name = account_name

        while True:
            newAccountNo = random.randint(10000, 99999)
            if bank.isAccount(newAccountNo):
                continue
            else:
                self.account_no = newAccountNo
                break

        self.totalMoney = 0
        bank.addAccount(self)

    def printBankInfo(self):
        print('-' * 40)
        print(f'account_name: {self.account_name}')
        print(f'account_no: {self.account_no}')
        print(f'totalMoney: {self.totalMoney}원')
        print('-' * 40)

class Bank:

    def __init__(self):
        self.accounts={}

    def addAcount(self,privateBank):
       self.acoounts[privateBank.account_no]=privateBank

    def isAccount(self,ano):
        return ano in self.accounts
import bank

koreaBank = bank.Bank()

new_account_name = input('통장 계설을 위한 예금주 입력: ')
myAccount = bank.PrivateBank(koreaBank, new_account_name)
myAccount.printBankInfo()

while True:

    selectNumber = int(input('1.입금, \t2.출금, \t3.종료 '))
    if selectNumber == 1:
        m = int(input('입금액 입력: '))
        koreaBank.doDeposit(myAccount.account_no, m)
        myAccount.printBankInfo()

    elif selectNumber == 2:
        m = int(input('출금액 입력: '))
        try:
            koreaBank.doWithdraw(myAccount.account_no, m)
        except bank.LackException as e:
            print(e)
        finally:
            myAccount.printBankInfo()
    elif selectNumber == 3:
        print('Bye~')
        break

    else:
        print('잘못 입력했습니다. 다시 선택하세요. ')

0개의 댓글