인프런 커뮤니티 질문&답변

Poki님의 프로필 이미지
Poki

작성한 질문수

남박사의 파이썬 기초부터 실전 100% 활용

숫자 야구게임 만들기 (파이썬기초, 랜덤함수, 반복문, 조건문)

질문드립니다.

작성

·

281

·

수정됨

1

사용자 입력 예외처리를 하고 있는데,

1)문자 입력 시 오류

2)3자리 숫자가 아닐 경우 오류

다음과 같이 코드를 짰는데 1)의 경우 except 부분에서 "입력 오류"를 출력하지만 2)의 경우 "입력오류"가 출력되지 않고 그냥 재입력하게 되네요.

혹시 이유를 알 수 있나요?

또한

문자 입력 시 "숫자만 입력 가능합니다"를 출력

두자리수 입력 시 "세 자리 수를 입력하세요"를 출력

하도록 하려면 코드를 어떻게 수정해야 할까요?

감사합니다.!

#세 자리 숫자만 입력할 수 있게 하는 함수
def input_check(msg, casting = int):
    while True:
        try:
            num = input(msg) # 사용자 입력
            num_str = str(num)
            #맨 앞의 수가 0일경우 0이 잘려버리기 때문에 str을 따로 저장
            if(casting(num) and len(num) == 3):
                return num_str
        except:
            print("입력 오류")
            continue

 

답변 2

3

try-except 문을 사용하시는 것도 괜찮은 방법이지만,
아래 방식으로도 의도대로 처리하실 수 있겠습니다.

def get_valid_num():
    while True:
        msg = "세 자리 유효한 숫자를 입력해주세요."
        num = input(msg)
        if not num.isdigit():
            # print("숫자를 입력해주세요.")
            continue
        if len(str(int(num))) != 3:
            # print("세 자리 수를 입력하세요.")
            continue
        return num

 

(지나가다 남긴 답변으로, 남박사님의 의견과는 무관합니다ㅜ)

Poki님의 프로필 이미지
Poki
질문자

헉 제가 너무 try-except 문에 꽂혀서 이생각을 못한것 같아요!

도와주셔서 감사합니다.

1

남박사님의 프로필 이미지
남박사
지식공유자

try except 만을 사용해서 작성한다고 한다면 다음과 같이 작성할 수 있습니다. 다만 이때 입력된 값이 숫자 3자리가 아닌경우는 오류를 강제 발생시켜야 하기에 사용자 정의 오류 클래스를 사용해서 처리할 수 있습니다.

class NumberLength(Exception):
    def __init__(self, msg):
        super().__init__(msg)
        
#세 자리 숫자만 입력할 수 있게 하는 함수
def input_check(msg, casting = int):
    while True:
        error = ""
        try:
            num = input(msg) # 사용자 입력
            if casting(num):
                return num
            if len(num) != 3 or (num[0] == "0" and len(num) == 3):
                error = "세자리 수를 입력하세요"
                raise NumberLength(error)
        except ValueError as e:
            print("숫자만 입력 가능합니다")
            continue
        except NumberLength as e:
            print(e)

a = input_check("입력: ")
print(a)

위의 코드를 테스트 해보시면 원하는 대로 동작하리라 생각됩니다.

image

코드를 실행해보면 위의 이미지 처럼 동작합니다. 그런데,

댓글중에 "일코"님께서 작성하신 것 처럼 조건문을 사용해서 처리하는게 더 깔끔한 코드일 수 있습니다. try except 문은 정말 어떤 예측 가능하지 않은 오류를 처리하기 위한 목적이기에 예외처리의 관점보다는 충분히 예측 가능한 내용은 조건문을 사용해서 작성하시는게 더 좋은 코드라 생각됩니다.

 

Poki님의 프로필 이미지
Poki

작성한 질문수

질문하기