IT프로그래밍/파이썬

파이썬 try except 사용법 : ValueError와 KeyError 예외 처리

MannizDev 2026. 8. 20.

키오스크에 나이를 넣는 칸이 있다고 해 보겠습니다. 손님이 20 대신 스무살이라고 치면, 계산이 이어지지 않고 프로그램이 그 자리에서 꺼집니다. 메뉴에 없는 딸기라테를 고를 때도 마찬가지입니다.

Java를 먼저 배운 분은 이런 처리를 트라이캐치라고 부르기도 합니다. 파이썬에서는 같은 일을 tryexcept로 합니다. try는 “일단 이 줄을 시도해 봐”, except는 “그 시도가 이 이유로 실패하면 안내하고 계속해”입니다.

실패할 수 있는 입력을 받았을 때, 가게 문을 닫지 않고 다음 손님을 받으려고 쓰는 문법이 이 글의 대상입니다.

한글 제목 파이썬 예외 처리와 try except, ValueError를 보여주는 대표 이미지

손님이 글자를 치면 프로그램이 꺼집니다

나이를 숫자로 바꿔 한 살을 더하는 코드입니다.

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: '스무살'

int에 한글 문자열을 넣어 ValueError가 발생한 Python 실행 기록

마지막 줄이 원인입니다. 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 * 27000입니다. 세 경우 모두 마지막 안내까지 실행됩니다.

같은 안내를 두 오류에 쓰고 싶다면 except (ValueError, KeyError):처럼 소괄호로 묶을 수 있습니다. 초보 단계에서는 원인을 화면에 다르게 보여 주는 쪽이 찾기 쉬우므로, 예외마다 except를 나누는 편을 권합니다.

except:처럼 이름을 빼면 종료 신호까지 받을 수 있습니다. 처음에는 지금 막힌 오류 이름만 적는 것이 안전합니다.

실패한 주문만 건너뛰면 됩니다

try는 실패할 수 있는 줄만 감싸고, except에는 실제로 난 오류 이름을 적습니다. int("스무살")ValueError, 없는 메뉴 키는 KeyError입니다. 이름이 다르면 프로그램은 예전처럼 그 줄에서 멈춥니다.

키 하나만 없을 수 있다면 get()이 더 짧습니다. 숫자 변환 실패와 없는 메뉴를 한 흐름에서 나눠 받아야 하면 try/except가 맞습니다. 목적은 오류를 숨기는 것이 아니라, 실패한 입력만 건너뛰고 다음 손님을 받는 것입니다.

나눗셈에서 0으로 나눌 때 나는 오류는 파이썬 산술 연산자 기초ZeroDivisionError로 확인할 수 있습니다. 함수에서 잘못된 입력을 직접 알리는 방법은 파이썬 함수 만들기ValueError 예제를 이어 보면 됩니다.

참고한 공식 문서

댓글

💲 추천 글