Python_7. 예외처리

소고기는레어·2021년 6월 6일
0

Python

목록 보기
7/10

예외처리

예외처리

  • 예외처리는 에러가 발생하였을 때 수행할 행동을 미리 지정해 놓는 것을 말한다.
# 예외처리로 실행할 코드를 try: 로 감싼다.
try:
    print("나누셈 계산기")
    nums = []
    num1 = int(input("첫 번째 숫자를 입력하세요. : "))
    num2 = int(input("두 번째 숫자를 입력하세요. : "))
    print("{0} / {1} = {2}".format(num1, num2, num1/num2))

# 예외처리할 에러명과 해당 에러 발생시 수행할 행동을 입력한다.
except ValueError:
    print("에러! 잘못된 값을 입력하였습니다.")

# err을 통해 기존의 에러 원인을 출력할 수 있다.
except ZeroDivisionError as err: # 에러 원인 출력
    print(err)
    # division by zero
    
# Exception은 위에서 일일히 지정하지 않은 나머지 에러들의 묶음을 의미한다.
except Exception as err:
    print("알 수 없는 에러가 발생하였습니다.")
    print(err)

에러 발생시키기

  • 특정 상황에 에러가 발생하도록 정할 수 있다.
try:
    print("한 자리 숫자 나눗셈 계산기")
    num1 = int(input("첫 번째 숫자를 입력하세요 : "))
    num2 = int(input("두 번째 숫자를 입력하세요 : "))

    # 에러를 띄울 상황과 어떤 에러를 띄울 것인지 정한다.
    # 두 자리 이상의 숫자 입력 시 ValueError 발생
    if num1 >= 10 or num2 >= 10:
        raise ValueError

    print("{0} / {1} = {2}".format(num1, num2, num1/num2))

# ValueError 발생 시 
except ValueError:
    print("잘못된 값을 입력하였습니다. 한 자리 숫자만 입력해주세요.")

사용자 정의 예외처리

  • 파이썬에서 정의된 에러 뿐만 아니라 사용자 본인이 직접 에러를 정의하는 것도 가능하다.
# 사용자 정의 에러명 입력
# 상속은 Exception
class BigNumberError(Exception):
       pass

try:
    print("한 자리 숫자 나눗셈 계산기")
    num1 = int(input("첫 번째 숫자를 입력하세요 : "))
    num2 = int(input("두 번째 숫자를 입력하세요 : "))

    # 특정 상황에 앞서 사용자 정의 에러명 호출하기
    if num1 >= 10 or num2 >= 10:
        raise BigNumberError

    print("{0} / {1} = {2}".format(num1, num2, num1/num2))

except ValueError:
    print("잘못된 값을 입력하였습니다.")

# 사용자 정의 에러 예외처리
except BigNumberError:
    print("에러가 발생하였습니다. 한 자리 숫자로 입력해주세요.")
    
# 에러가 발생하였습니다. 한 자리 숫자로 입력해주세요.
    
    
    
# 에러시 띄울 문구도 정의가 가능하다.
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, num1/num2))

except ValueError:
    print("잘못된 값을 입력하였습니다.")

except BigNumberError as err:
    print("에러가 발생하였습니다. 한 자리 숫자로 입력해주세요.")
    print(err)
    
# 에러가 발생하였습니다. 한 자리 숫자로 입력해주세요.
# 예시) 입력값 : 10, 1

finaly

  • finaly는 try문에서 에러 발생 여부에 상관 없이 마지막에 무조건 실행되는 구문이다.
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, num1/num2))

except ValueError:
    print("잘못된 값을 입력하였습니다.")

except BigNumberError as err:
    print("에러가 발생하였습니다. 한 자리 숫자로 입력해주세요.")
    print(err)
finally:
    print("계산기를 이용해 주셔서 감사합니다.")

연습 문제

  • 치킨집 대기 손님을 위한 자동 주문 시스템을 제작하였다.

  • 이 시스템의 코드를 확인하고, 적절한 예외처리 구문 넣기.

  • 조건 1

    • 1보다 작거나 숫자가 아닌 입력값은 ValueError로 처리
    • 출력은 "잘못된 값을 입력하였습니다."
  • 조건 2

    • 남은 치킨 재고는 10마리인 것으로 가정.

    • 재고 소진 시 사용자 정의 에러 [soleOutError] 발생시키고 프로그램 종료시키기

    • 출력은 "재고가 소진되어 더 이상 주문을 받지 않습니다."

  • 문제 코드

chicken = 10
waiting = 1

while(True):

    print("[남은 치킨 : {0}]".format(chicken))
    order = int(input("치킨 몇 마리를 주문하시겠습니까? : "))

    if order > chicken:
        print("재료가 부족합니다.")
    else:
        print("[대기번호 {0}] {1} 마리 주문이 완료되었습니다.".format(waiting, order))
        waiting += 1
        chicken -= order
  • 답안
# 사용자 정의 에러
class soldOutError(Exception):
    pass

chicken = 10
waiting = 1
try: # try문으로 감싸기
    while(True):

        print("[남은 치킨 : {0}]".format(chicken))
        order = int(input("치킨 몇 마리를 주문하시겠습니까? : "))

        if order > chicken:
            print("재료가 부족합니다.")
        elif order <= 0: # 입력값이 음수일 경우
            raise ValueError
        else:
            print("[대기번호 {0}] {1} 마리 주문이 완료되었습니다.".format(waiting, order))
            waiting += 1
            chicken -= order
    
        if chicken == 0: # 재고 소진일 경우
            raise soldOutError
            
# 예외처리
except ValueError:
    print("잘못된 값을 입력하였습니다.")
except soldOutError:
    print("재고가 소진되어 주문 접수를 마감합니다.")
      
profile
https://www.rarebeef.co.kr/

0개의 댓글