Try 와 except로 예외처리
try:
print("나누기 전용 계산기입니다.")
num1=int(input("첫 번째 숫자를 입력하세요:"))
num2=int(input("두 번째 숫자를 입력하세요:"))
print("{0}/{1}={2}".format(num1,num2,int(num1/num2)))
except ValueError:
print("에러! 잘못된 값을 입력하였습니다.")
except ZeroDivisionError as err:
print(err)
value error :값이 잘못 입력 됐을 때
zerodivision error: 0으로 나누는 문제가 발생했을 때
Terminal>>
나누기 전용 계산기입니다.
첫 번째 숫자를 입력하세요:3
두 번째 숫자를 입력하세요:삼
에러! 잘못된 값을 입력하였습니다.
나누기 전용 계산기입니다.
첫 번째 숫자를 입력하세요:3
두 번째 숫자를 입력하세요:0
division by zero
1. try: 한후 밑 줄부터 tab 눌러서 입력
2. num1, num2은 정수이므로 int(input("첫 번째 숫자를 입력하세요 : "))
2. except valueerror : 이 뜻은 만약 인풋으로 정수가 아닌 숫자 '삼'을 쓰게 된다면 ~ print("에러!..) 출력해라
3. except zerodivisionerror as err: 0으로 나누는 에러인 경우 ~ print(err) 에러가 일어난 이유 자체를 출력해라
-입력되는 숫자와 결과값을 리스트 안에 집어넣다가 빠뜨린 경우( except exception as err:)
try:
print("나누기 전용 계산기입니다.")
nums=[]
nums.append(int(input("첫 번째 숫자를 입력하세요:")))
nums.append(int(input("두 번째 숫자를 입력하세요:")))
# nums.append(int(input(nums[0]/nums[1])))
print("{0}/{1}={2}".format(nums[0],nums[1],nums[2]))
except Exception as err:
print(err)
1. nums라는 리스트를 만들고 첫 번째 인풋을 int로 감싸서 첫 번째 value로 만든다.
2. 두번째 인풋을 int로 감싸서 두 번째 value로 만든다.
3.첫번째 인풋/ 두 번째 인풋의 결과를 세 번째 value로 만든다.
4. print한다. 이때 만약, 세 번째 value가 실수로 빠졌다고 가정하고 오류를 발견하기 위해
5. except exception as err:
print(err)라고 입력하면 왜 오류가 생긴지 알려준다. ( list index out of range )
Terminal>>
나누기 전용 계산기입니다.
첫 번째 숫자를 입력하세요:6
두 번째 숫자를 입력하세요:3
list index out of range
-입력되는 숫자와 결과값을 리스트 안에 집어넣다가 빠뜨린 경우2( except :)
try:
print("나누기 전용 계산기입니다.")
nums=[]
nums.append(int(input("첫 번째 숫자를 입력하세요:")))
nums.append(int(input("두 번째 숫자를 입력하세요:")))
# nums.append(int(input(nums[0]/nums[1])))
print("{0}/{1}={2}".format(nums[0],nums[1],nums[2]))
except ZeroDivisionError as err:
print(err)
except:
print("알 수 없는 에러가 발생하였습니다.")
1. zerodivisionerror가 에러가 아니라면 except: 의 뜻은 그 외의 모든 오류가 발생하면 print("알 수 없는 에러가 발생하였습니다.")라고 출력해라 !
*이 때 유의점은 except:는 맨 마지막에 올 수 있다는 것. 중간에 못 들어감. if else처럼!
에러 발생시키기(if ,raise, except)
try:
print("한 자리 숫자 나누기 전용 계산기입니다")
num1= int(input("첫 번째 숫자를 입력하세요 : "))
num2= int(input("두 번째 숫자를 입력하세요 : "))
if num1 >=10 or num2>=10:
raise ValueError
print("{0}/{1}={2}".format(nums1,num2, int(num1/num2)))
except ValueError:
print("잘못된 값을 입력하였습니다. 한 자리 숫자만 입력하세요. ")
1. 일단 try 와 except는 한 세트고 같은 줄에 있어야함.
2. if num1과 num2가 두 자리수가 입력된다면 raise valueerror 밸류에러를 일으켜라!
3. except valueerror: 로 와서 print 하면됨.
4. if num1과 num2가 한 자리수가 입력된다면 print하면 됨.
사용자 정의 예외처리(zerodivision, valueerror같이 파이썬에서 제공하는 것 이외에)
- class를 이용하여 ★
class bignumbererror(exception):
def __init__(self,msg):
self.msg=msg
def __str__(self):
returm self.msg
try:
print("한 자리 숫자 나누기 전용 계산기입니다")
num1= int(input("첫 번째 숫자를 입력하세요 : "))
num2= int(input("두 번째 숫자를 입력하세요 : "))
if num1 >=10 or num2>=10:
raise bignumbererror("입력값:{0},{1}".format(num1,num2))
print("{0}/{1}={2}".format(num1,num2, int(num1/num2)))
except bignumbererror as err:
print("에러가 발생하였습니다. 한 자리 숫자만 입력하세요.")
print(err)
Terminal>>
한 자리 숫자 나누기 전용 계산기입니다
첫 번째 숫자를 입력 하세요 : 10
두 번째 숫자를 입력 하세요 : 15
에러가 발생하였습니 다.한 자리 숫자만 입력하세요.
입력값:10,15 <<메세지 출력됨.
1. class bignumbererror 생성
2. raise로 bignumbererror(msg 메세지 입력해 놓기)
3. 만약 두 자리수가 들어온다면 메세지에 입력되어서 init 메소드와 str 메소드를 거쳐 print(err)를 입력하면 메세지 출력
finally (예외처리에서 정상/오류가 나던 무조건 실행되는 구문)
- 오류가 생겼을 때 프로그램 강제 종료를 막아 완성도를 높이는 역할
class bignumbererror(Exception):
def __init__(self,msg):
self.msg=msg
def __str__(self):
return self.msg
try:
print("한 자리 숫자 나누기 전용 계산기입니다")
num1= int(input("첫 번째 숫자를 입력하세요 : "))
num2= int(input("두 번째 숫자를 입력하세요 : "))
if num1 >=10 or num2>=10:
raise bignumbererror("입력값:{0},{1}".format(num1,num2))
print("{0}/{1}={2}".format(num1,num2, int(num1/num2)))
except bignumbererror as err:
print("에러가 발생하였습니다. 한 자리 숫자만 입력하세요.")
print(err)
finally:
print("계산기를 이용해 주셔서 감사합니다. ")
한 자리 숫자 나누기 전용 계산기입니다
첫 번째 숫자를 입력 하세요 : 10
두 번째 숫자를 입력 하세요 : 5
에러가 발생하였습니 다.한 자리 숫자만 입력하세요.
입력값:10,5
계산기를 이용해 주셔서 감사합니다.
예외처리 문제
정답
class soldouterror(Exception):
pass
chicken=10
waiting=1
while(True):
try:
print("[남은 치킨:{0}].".format(chicken))
order=int(input("치킨 몇 마리 주문하시겠습니까?")) #첫 번째 조건: 숫자가 아닌 입력값일 때
if order>chicken:
print("재료가 부족합니다")
elif order <=0: # 첫 번째 조건: 1보다 작은 숫자일 때 예외처리
raise ValueError
else:
print("[대기번호{0} {1}마리 주문이 완료되었습니다.]"\
.format(waiting,order))
waiting+=1
chicken-=order
if chicken ==0: #두 번째 조건 치킨 소진 시 soldouterror 발생시키기
raise soldouterror
except ValueError:
print("잘못된 값을 입력하였습니다.")
except soldouterror:
print("재고가 소진되어 더 이상 주문을 받지 않습니다.")
break #두 번째 조건 프로그램 종료(while문 탈출)
1. while 문 안에 try 넣는 것. 조건 1을 만족시키기 위해 elif order<=0: raise valueerror
2. 조건 2 만족시키기 위해 가장 위에 soldouterror 클래스를 만들고 pass한 후 while 안 try에서 조건 추가
3. 치킨을 시키는 만큼 order에서 빼야한다는 chicken -=order 밑에 if chicken==0이라면 raise soldouterror
4. 조건2에서 재고가 소진된 경우 프로그램을 종료해야하므로 except souldouterr: 아래 break 넣기
'Python' 카테고리의 다른 글
[파이썬] 모듈 Ⅱ (모듈 위치확인-inspect& getfile, 패키지 다운로드 및 활용- pypi, pip install ) (1) | 2024.11.10 |
---|---|
[파이썬] 모듈 ( import, from import , package, detail함수, __all__,__name__) (2) | 2024.11.10 |
[파이썬] 클래스class Ⅲ ( pass, super ) (1) | 2024.11.09 |
[파이썬]클래스class Ⅱ (상속, 다중상속, 메소드오버라이딩) (0) | 2024.11.09 |
[파이썬] 클래스class (__init__,멤버변수, 메소드) (1) | 2024.11.09 |