[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('잘못 입력했습니다. 다시 선택하세요. ')