Python

[파이썬] 예외처리(try, except, ValueError, ZeroDivision, raise, __str__, break, finally)

뉴라코 2024. 11. 10. 17:06
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 넣기