본문 바로가기
공부 & 프로젝트/파이썬

[파이썬] 예외 처리- Try, Except, Raise

by donnanoa82 2025. 10. 15.

나도코딩님의 동영상 진짜 이해되도록 알려주심 

파이썬 기본은 이 동영상으로 끝내도 될 듯 bbbbb 

https://www.youtube.com/watch?v=kWiCuklohdY

 

예외 처리

Try & Except

print("나누기 전용 계산기입니다")
num1= int(input("첫 번째 숫자를 적으세요: "))
num2= int(input("두 번째 숫자를 적으세요: "))
print(f"{num1} / {num2} = {int(num1/num2)}")

 

여기서 input 값에 숫자가 아닌 문자(예: 삼)을 넣게 되면 오류가 뜨게 됨

 

오류를 없애기 위해 Try와 Except을 사용

=> 에러 발생 시, 원하는 문구가 나오도록 할 수 있음

try: 
    print("나누기 전용 계산기입니다")
    num1= int(input("첫 번째 숫자를 적으세요: "))
    num2= int(input("두 번째 숫자를 적으세요: "))
    print(f"{num1} / {num2} = {int(num1/num2)}")
except ValueError:
    print("에러! 숫자를 입력하세요")


또 다른 방식으로 위 코드 짤 수 도 있음

nums라는 빈 리스트를 만들어서 그 리스트에 넣는 형태

try: 
    print("나누기 전용 계산기입니다")
    nums = []
    nums.append(int(input("첫 번째 숫자를 적으세요: ")))
    nums.append(int(input("두 번째 숫자를 적으세요: ")))
    nums.append(int(nums[0]/nums[1]))
    print(f"{nums[0]} / {nums[1]} = {nums[2]}")
except ValueError:
    print("에러! 숫자를 입력하세요")

 

예외처리 방식:

(1) ValueError : Value값을 잘못 넣은 상태에서 처리 

(2) ZeroDivisionError : 0값을 나눗셈에 넣어서 오류난 상태에서 처리 

     err = "division by zero"라고 입력될

(3) except : 아래의 경우에는 ValueError, ZeroDivisionError 외에 모든 에러들을 처리

except ValueError:
    print("에러! 숫자를 입력하세요")
except ZeroDivisionError as err:
    print(err)
except :
    print("알 수 없는 에러가 발생했습니다")

 

except 로 사용 시, 어떤 에러인지 모름 

=> 어떤 에러인지 알고 싶은 경우, 아래와 같이 except Exception as err을 사용하면 에러 원인 확인 가능

except Exception as err:
    print("알 수 없는 에러가 발생했습니다")
    print(err)

 

Raise

우리가 의도적으로 에러를 발생시켜서 원하는 값을 만들 수 있음

try: 
    print("나누기 전용 계산기입니다")
    num1= int(input("첫 번째 숫자를 적으세요: "))
    num2= int(input("두 번째 숫자를 적으세요: "))
    if num1 >= 10 or num2 >= 10:
        raise ValueError
    print(f"{num1} / {num2} = {int(num1/num2)}")
except ValueError:
    print("에러! 한 자리 숫자를 넣으세요")


class를 만들어서 오류 처리 가능 

raise를 BignumberError로 넣었기 때문에 아래에 except ValueError 이 있더라도 except BignumberError의 문구를 따라서 나옴

class BignumberError(Exception):
    pass

try: 
    print("나누기 전용 계산기입니다")
    num1= int(input("첫 번째 숫자를 적으세요: "))
    num2= int(input("두 번째 숫자를 적으세요: "))
    if num1 >= 10 or num2 >= 10:
        raise BignumberError
    print(f"{num1} / {num2} = {int(num1/num2)}")
except ValueError:
    print("에러! 한 자리 숫자를 넣으세요")
except BignumberError:
    print("오류가 발생하였습니다. 한 자리 숫자를 넣으세요")


입력값을 어떤걸 넣었는지 확인하려면 아래와 같이 코딩 짜기:

raise BignumberError에 입력값 msg가 들어가게 되며 = err 값

=> except BignumberError as err 하고 print(err)하게 되면 raise에 넣었던 값이 출력

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(f"입력값: {num1}, {num2}")
    print(f"{num1} / {num2} = {int(num1/num2)}")
except ValueError:
    print("에러! 한 자리 숫자를 넣으세요")
except BignumberError as err:
    print("오류가 발생하였습니다. 한 자리 숫자를 넣으세요")
    print(err)

 

Finally

마지막에 나오는 내용으로, 값이 잘 나오거나/ / / 오류가 뜨거나 상관없이 나오는 내용

finally:
    print("계산해주셔서 감사합니다")

 

나온 값과 같이, 값이 잘 나오더라도 "계산해주셔서 감사합니다"

오류가 발생했더라도 "계산해주셔서 감사합니다" 출력

 


Quiz 부분

# 동네에 항상 대기 손님이 있는 맛있는 치킨집 있음
# 대기 손님의 치킨 요리 시간 줄이고자 자동 주문 시스템 제작
# 시스템 코드 확인하고 적절한 에외처리 구문 넣기

조건 1

- 1보다 작거나 숫자가 아닌 입력값이 들어올 때는 VlaueError로 처리
- 출력 메시지: "잘못된 값을 입력하였습니다"
조건 2:

- 대기 손님이 주문할 수 있는 총 치킨량은 10마리로 한정
- 치킨 소진 시 사용자 정의 에러[SoldOutError]를 발생시키고 프로그램 종료
- 출력 메시지: "재고가 소진되어 더 이상 주문 받지 않습니다."

[코드]
chicken = 10
waiting = 1 #홀 안에는 현재 만석, 대기번호 1부터 시작

while(True):
        print(f"[남은 치킨: {chicken}]")
        order = int(input("치킨 몇 마리 주문하시겠습니까?"))
        if order > chicken: #남은 치킨보다 주문량 많을 때
            print("재료가 부족합니다.")
        else: 
            print(f"[대기번호 {waiting}] {order} 마리 주문이 완료되었습니다.")
            waiting += 1
            chicken -= order

 


#답

제공 받은 코드에서 추가 필요했던 코드 :

  • SoldOutError class 입력
  • elif order <= 0: raise 부분 입력
  • except 부분 입력
chicken = 10
waiting = 1 #홀 안에는 현재 만석, 대기번호 1부터 시작

class SoldOutError (Exception):
    pass

while(True):
    try:
        print(f"[남은 치킨: {chicken}]")
        order = int(input("치킨 몇 마리 주문하시겠습니까?"))
        if order > chicken: #남은 치킨보다 주문량 많을 때
            print("재료가 부족합니다.")
        elif order <= 0:
            raise ValueError
        else: 
            print(f"[대기번호 {waiting}] {order} 마리 주문이 완료되었습니다.")
            waiting += 1
            chicken -= order

        if chicken == 0:
            raise SoldOutError

    except ValueError:
        print("잘못된 값을 입력하였습니다")
    except SoldOutError:
        print("재고가 소진되어 더 이상 주문 받지 않습니다.")
        break