키오스크에 나이를 넣는 칸이 있다고 해 보겠습니다. 손님이 20 대신 스무살이라고 치면, 계산이 이어지지 않고 프로그램이 그 자리에서 꺼집니다. 메뉴에 없는 딸기라테를 고를 때도 마찬가지입니다.
Java를 먼저 배운 분은 이런 처리를 트라이캐치라고 부르기도 합니다. 파이썬에서는 같은 일을 try와 except로 합니다. try는 “일단 이 줄을 시도해 봐”, except는 “그 시도가 이 이유로 실패하면 안내하고 계속해”입니다.
실패할 수 있는 입력을 받았을 때, 가게 문을 닫지 않고 다음 손님을 받으려고 쓰는 문법이 이 글의 대상입니다.

손님이 글자를 치면 프로그램이 꺼집니다
나이를 숫자로 바꿔 한 살을 더하는 코드입니다.
print("변환을 시작합니다.")
age = int("스무살")
print("변환 성공 :", age)
print("이 줄은 실행되지 않습니다.")
실행하면 첫 문장만 나오고 멈춥니다.
변환을 시작합니다.
Traceback (most recent call last):
File "01_valueerror_crash.py", line 2, in <module>
age = int("스무살")
ValueError: invalid literal for int() with base 10: '스무살'

마지막 줄이 원인입니다. ValueError는 값의 모양이 기대한 정수와 다르다는 뜻이고, '스무살'이 그 값입니다. 문법 오류가 아니라 실행 중에 나는 오류를 예외라고 부릅니다. 예외를 받지 않으면 그 줄 아래는 실행되지 않습니다.
Python input 사용법에서 키보드로 나이를 받을 때도, 손님이 숫자를 쓰지 않으면 같은 지점에서 막힙니다.
try는 시도하고 except는 실패를 받아 줍니다
같은 변환을 그물로 받습니다.
print("변환을 시작합니다.")
try:
age = int("스무살")
print("변환 성공 :", age)
except ValueError:
print("숫자로 바꿀 수 없는 값입니다.")
print("이 줄은 실행됩니다.")
변환을 시작합니다.
숫자로 바꿀 수 없는 값입니다.
이 줄은 실행됩니다.
흐름은 단순합니다.
try안의 코드를 먼저 실행합니다.- 실패하지 않으면
except는 건너뜁니다. ValueError가 나면try의 나머지 줄은 건너뛰고except를 실행합니다.- 그다음
try/except바깥 코드가 이어집니다.
그래서 변환 성공은 안 나오고, 이 줄은 실행됩니다는 나옵니다. 오류를 없었던 일로 만든 것이 아니라, 실패한 변환만 건너뛴 것입니다.
언제 이 그물을 칠까요. 손님이 뭘 칠지 모를 때, 메뉴에 없는 이름을 고를 수 있을 때, 실패해도 다음 주문을 받아야 할 때입니다. 반대로 프로그램이 반드시 가지고 있어야 하는 설정이 빠졌다면, 일부러 멈추게 두어 원인을 빨리 보는 편이 낫습니다.
한 번 실패했다고 키오스크를 끄지 않습니다
손님 세 명이 나이를 이렇게 적었다고 칩니다. 스무살, 20.5, 21. 앞에서부터 받아서, 정수로 바뀌는 첫 값만 쓰면 됩니다.
samples = ["스무살", "20.5", "21"]
age = None
for text in samples:
try:
age = int(text)
print("변환 성공 :", age)
break
except ValueError:
print("숫자로 바꿀 수 없음 :", text)
print("최종 나이 :", age)
숫자로 바꿀 수 없음 : 스무살
숫자로 바꿀 수 없음 : 20.5
변환 성공 : 21
최종 나이 : 21
20.5도 실패합니다. int()는 정수 모양의 문자열만 받습니다. "21"은 되고 "20.5"는 안 됩니다. 소수까지 받으려면 float()이 필요하고, 그건 이 글의 try/except와는 다른 선택입니다.
실제 키보드라면 Python input 사용법의 input()에 같은 try를 넣으면 됩니다.
없는 메뉴 이름도 같은 그물로 받습니다
파이썬 딕셔너리 get 사용법과 KeyError 해결에서는 없는 키를 get()으로 읽었습니다. try/except로도 키오스크가 꺼지지 않게 할 수 있습니다.
menu = {
"아메리카노": 3500,
"카페라테": 4200,
}
try:
price = menu["딸기라테"]
print("가격 :", price)
except KeyError:
print("메뉴에 없는 이름입니다.")
print("주문 안내를 계속합니다.")
print("get 결과 :", menu.get("딸기라테", "메뉴 없음"))
메뉴에 없는 이름입니다.
주문 안내를 계속합니다.
get 결과 : 메뉴 없음
기본값만 필요하면 get()이 한 줄입니다. 실패했을 때 안내 문장을 출력하고 다음 일을 이어가려면 try/except가 편합니다. 파이썬 set 사용법의 remove()처럼, 없는 값을 지울 때 KeyError가 나는 메서드에도 같은 방식을 쓸 수 있습니다.
| 손님이 한 일 | 코드 |
|---|---|
| 없어도 기본 안내만 보여 주면 됨 | menu.get("키", "메뉴 없음") |
| 있을 때와 없을 때 할 일이 다름 | if "키" in menu: |
| 실패를 알리고 다음 주문으로 넘어감 | try / except KeyError |
없는 메뉴를 부드럽게 넘기는 것과, 영업에 꼭 필요한 설정이 빠진 것을 오류로 발견하는 것은 다릅니다. 키가 빠지면 안 되는 값은 대괄호 조회를 그대로 두는 편이 원인을 더 빨리 보여 줍니다.
except에 적은 이름과 실제 오류가 같아야 합니다
그물은 적어 둔 예외만 받습니다. KeyError가 떨어지는데 ValueError 그물만 쳐 두면, 키오스크는 예전처럼 꺼집니다.
menu = {
"아메리카노": 3500,
"카페라테": 4200,
}
try:
print(menu["딸기라테"])
except ValueError:
print("ValueError만 처리합니다.")
print("이 줄은 실행되지 않습니다.")
Traceback (most recent call last):
File "05_wrong_except_type.py", line 7, in <module>
print(menu["딸기라테"])
KeyError: '딸기라테'
ValueError만 처리합니다도, 바깥의 마지막 print()도 나오지 않습니다. 이름이 다른 except는 없는 것과 같습니다.
수량과 메뉴처럼 실패 이유가 둘이면, 그물도 둘로 칩니다.
menu = {
"아메리카노": 3500,
"카페라테": 4200,
}
def checkout(order, count_text):
try:
count = int(count_text)
price = menu[order]
print("결제 금액 :", price * count)
except ValueError:
print("수량은 정수로 입력해야 합니다. 입력값 :", count_text)
except KeyError:
print("메뉴에 없는 이름입니다. 주문 :", order)
checkout("아메리카노", "두 잔")
checkout("딸기라테", "2")
checkout("아메리카노", "2")
print("다음 주문을 받을 수 있습니다.")
수량은 정수로 입력해야 합니다. 입력값 : 두 잔
메뉴에 없는 이름입니다. 주문 : 딸기라테
결제 금액 : 7000
다음 주문을 받을 수 있습니다.
첫 주문은 "두 잔"을 숫자로 바꾸다 ValueError가 납니다. 둘째는 수량은 2인데 딸기라테가 없어 KeyError가 납니다. 셋째는 3500 * 2로 7000입니다. 세 경우 모두 마지막 안내까지 실행됩니다.
같은 안내를 두 오류에 쓰고 싶다면 except (ValueError, KeyError):처럼 소괄호로 묶을 수 있습니다. 초보 단계에서는 원인을 화면에 다르게 보여 주는 쪽이 찾기 쉬우므로, 예외마다 except를 나누는 편을 권합니다.
except:처럼 이름을 빼면 종료 신호까지 받을 수 있습니다. 처음에는 지금 막힌 오류 이름만 적는 것이 안전합니다.
실패한 주문만 건너뛰면 됩니다
try는 실패할 수 있는 줄만 감싸고, except에는 실제로 난 오류 이름을 적습니다. int("스무살")은 ValueError, 없는 메뉴 키는 KeyError입니다. 이름이 다르면 프로그램은 예전처럼 그 줄에서 멈춥니다.
키 하나만 없을 수 있다면 get()이 더 짧습니다. 숫자 변환 실패와 없는 메뉴를 한 흐름에서 나눠 받아야 하면 try/except가 맞습니다. 목적은 오류를 숨기는 것이 아니라, 실패한 입력만 건너뛰고 다음 손님을 받는 것입니다.
나눗셈에서 0으로 나눌 때 나는 오류는 파이썬 산술 연산자 기초의 ZeroDivisionError로 확인할 수 있습니다. 함수에서 잘못된 입력을 직접 알리는 방법은 파이썬 함수 만들기의 ValueError 예제를 이어 보면 됩니다.
참고한 공식 문서
'IT프로그래밍 > 파이썬' 카테고리의 다른 글
| 파이썬 sorted와 sort 차이 : key와 lambda로 원하는 기준 정렬하기 (0) | 2026.09.01 |
|---|---|
| 파이썬 enumerate와 zip 사용법 : 번호와 두 리스트를 함께 꺼내기 (0) | 2026.08.26 |
| 파이썬 리스트 컴프리헨션 : for문 한 줄의 순서와 if 위치 (0) | 2026.08.21 |
| 파이썬 파일 읽기 쓰기 : with open으로 주문장을 남기는 방법 (0) | 2026.08.20 |
| 파이썬 set 사용법 : 리스트 중복 제거와 순서 유지 방법 (0) | 2026.08.18 |
| 파이썬 튜플과 리스트 차이 : 원소 1개에는 왜 쉼표가 필요할까 (0) | 2026.08.14 |
| 파이썬 딕셔너리 사용법 : KeyError를 get으로 막는 가장 쉬운 방법 (0) | 2026.08.14 |
| 파이썬 in 연산자 기초 : 문자열 속 단어를 어떻게 찾을까 (0) | 2026.08.11 |
댓글