Windows · Python 3.12.4. 본문의 첫 예제를 실행하여 표준 출력과 예상 결과가 일치함을 확인했습니다. 연습문제의 모든 입력을 검증한 것은 아닙니다.
이 글의 순서 5개 단락
계산기에 숫자 대신 문자를 입력하면 float() 변환이 실패합니다. 이번에는 그 상황을 처리해 프로그램을 끝내지 않고 다음 계산을 시작하겠습니다. 예제의 실행 환경은 Python 3.12입니다.
핵심 개념: 숫자 변환 실패 처리하기
프로그램을 실행하는 도중 발생하는 오류를 예외라고 합니다. float()에 hello처럼 숫자로 바꿀 수 없는 문자열을 전달하면 ValueError가 발생합니다.
try에는 예외가 발생할 수 있는 코드를 넣고, except ValueError에는 해당 예외가 발생했을 때 실행할 코드를 넣습니다. 변환에 성공하면 except는 건너뜁니다. 이 동작은 Python 공식 문서의 예외 처리 설명에서 확인할 수 있습니다.
반복 계산기에 적용하기
연산자를 먼저 입력하고, q가 아니면 두 숫자를 입력합니다. 숫자 변환에 실패하면 안내한 뒤 연산자 입력부터 다시 시작합니다.
while True:
print("연산자 입력 (+, -, *, /) 또는 종료(q):")
operator = input()
if operator == "q":
print("계산기를 종료합니다.")
break
if operator != "+" and operator != "-" and operator != "*" and operator != "/":
print("지원하지 않는 연산자입니다.")
continue
try:
print("첫 번째 숫자 입력:")
first = float(input())
print("두 번째 숫자 입력:")
second = float(input())
except ValueError:
print("숫자로 변환할 수 없습니다. 계산을 다시 시작합니다.")
continue
if operator == "+":
result = first + second
elif operator == "-":
result = first - second
elif operator == "*":
result = first * second
elif second == 0:
print("0으로 나눌 수 없습니다.")
continue
else:
result = first / second
print("결과:", result)

다음 입력은 첫 계산에서 잘못된 첫 번째 숫자를 넣고, 두 번째 계산에서 정상적인 덧셈을 수행한 뒤 종료합니다. 각 줄에서 Enter를 누릅니다.
+
abc
+
7
3
q
예상 출력은 다음과 같습니다. 아래에는 프로그램이 출력하는 문구만 표시합니다.
연산자 입력 (+, -, *, /) 또는 종료(q):
첫 번째 숫자 입력:
숫자로 변환할 수 없습니다. 계산을 다시 시작합니다.
연산자 입력 (+, -, *, /) 또는 종료(q):
첫 번째 숫자 입력:
두 번째 숫자 입력:
결과: 10.0
연산자 입력 (+, -, *, /) 또는 종료(q):
계산기를 종료합니다.
왜 다시 입력받을까요?
abc를 float()로 바꾸는 순간 ValueError가 발생합니다. 그러면 try의 나머지 부분은 건너뛰므로 두 번째 숫자를 묻지 않고 except로 이동합니다. 안내 문구를 출력한 후 continue가 현재 반복을 끝내고 while의 처음으로 돌아갑니다.
다음 반복에서 입력한 7과 3은 각각 7.0과 3.0으로 변환됩니다. 선택한 연산자가 +이므로 결과는 10.0입니다. q를 입력하면 break가 반복을 끝냅니다.
흔한 실수와 경계 조건
두 번째 숫자에서 변환이 실패해도 같은 except가 처리합니다. 이때 첫 번째 숫자는 이미 입력했지만, continue 때문에 그 값을 사용한 계산은 수행하지 않습니다. 다시 연산자와 두 숫자를 모두 입력해야 합니다.
빈 입력이나 공백만 입력한 경우에도 숫자로 변환할 수 없어 같은 안내가 나옵니다. 반면 -2나 1.5는 변환할 수 있습니다. float()는 inf와 nan 같은 특수한 값도 받아들이므로, 이 예제는 유한한 숫자만 허용하는 검사는 하지 않습니다. 허용되는 형식은 Python 공식 문서의 float() 설명을 참고하세요.
except ValueError는 숫자 변환 실패를 처리하지만 모든 오류를 처리하지는 않습니다. 또한 continue를 빼면 변환에 실패한 뒤에도 계산 부분으로 진행하여 값이 없거나 이전 반복의 값이 남아 있는 문제가 생길 수 있습니다. 나눗셈의 두 번째 숫자가 0인 경우는 별도의 조건문으로 처리합니다.
작은 연습과 풀이
연산자로 *를 선택하고 첫 번째 숫자에 4, 두 번째 숫자에 사과를 입력하면 무엇이 출력되고 다음에는 무엇을 입력해야 할까요?
두 번째 변환에서 ValueError가 발생하므로 숫자로 변환할 수 없습니다. 계산을 다시 시작합니다.가 출력됩니다. 곱셈은 수행되지 않고 반복문의 처음으로 돌아가므로 연산자부터 다시 입력합니다. 예를 들어 *, 4, 3을 차례로 입력하면 예상 결과는 12.0입니다.
CHECK THE SOURCE
참고한 공식 문서
기능 설명은 위 문서를 참고했으며, 예제의 입력·결과와 한계는 본문에 따로 기록했습니다.