작성
·
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
(지나가다 남긴 답변으로, 남박사님의 의견과는 무관합니다ㅜ)
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)
위의 코드를 테스트 해보시면 원하는 대로 동작하리라 생각됩니다.
코드를 실행해보면 위의 이미지 처럼 동작합니다. 그런데,
댓글중에 "일코"님께서 작성하신 것 처럼 조건문을 사용해서 처리하는게 더 깔끔한 코드일 수 있습니다. try except 문은 정말 어떤 예측 가능하지 않은 오류를 처리하기 위한 목적이기에 예외처리의 관점보다는 충분히 예측 가능한 내용은 조건문을 사용해서 작성하시는게 더 좋은 코드라 생각됩니다.
헉 제가 너무 try-except 문에 꽂혀서 이생각을 못한것 같아요!
도와주셔서 감사합니다.