티스토리 뷰

이번 챕터에서는 Python에서 함수나 연산이 기대하는 값의 조건을 벗어날 때 발생하는 ValueError의 정의와 주요 원인, 실습 예제 및 해결 방법을 상세히 다룹니다. 초보 개발자도 바로 적용 가능한 디버깅 팁을 통해 오류를 빠르게 파악하고 수정할 수 있습니다.

1. ValueError란?

ValueError는 함수나 연산이 올바른 자료형의 인자를 받았지만, 해당 값이 유효한 범위나 형식에 맞지 않을 때 발생하는 예외입니다. 예를 들어 문자열을 정수로 변환할 때 숫자 이외의 문자가 포함되었거나, 리스트에서 존재하지 않는 값을 제거하려 할 때, 튜플 언팩(unpack) 시 요소 개수가 맞지 않을 때 흔히 마주치게 됩니다. 이 에러는 실행 중에 즉시 감지되며, 에러 메시지에 잘못된 값과 위치 정보가 표시됩니다.

2. 실습 예제

아래 코드를 실행하면 다양한 상황에서 ValueError가 발생하는 예시를 확인할 수 있습니다.

# 예제 1: 문자열 → 정수 변환 오류
num_str = "abc123"
num = int(num_str)

# 예제 2: 리스트에서 없는 값 제거
items = [1, 2, 3]
items.remove(4)

# 예제 3: 튜플 언팩 개수 불일치
point = (10, 20, 30)
x, y = point

# 예제 4: 날짜 문자열 형식 오류
import datetime
date = datetime.datetime.strptime("2025/15/07", "%Y/%d/%m")

위 예제에서는 각각 잘못된 문자열, 존재하지 않는 리스트 값, 튜플 언팩 개수 불일치, 그리고 날짜 형식 오류로 ValueError가 발생합니다.

3. 실행 결과 및 설명

터미널에 아래와 유사한 메시지가 순서대로 출력됩니다:

ValueError: invalid literal for int() with base 10: 'abc123'
ValueError: list.remove(x): x not in list
ValueError: not enough values to unpack (expected 2, got 3)
ValueError: time data '2025/15/07' does not match format '%Y/%d/%m'

각 메시지는 “무엇이 잘못된 값인지”와 “어떤 형식이 기대되었는지”를 구체적으로 알려주므로, 해당 위치를 중심으로 원인을 탐색할 수 있습니다.

4. 해결 방법 & 디버깅 팁

  1. 값 검증: 사용자 입력이나 외부 데이터를 사용 전 `if`, `try/except`로 미리 검증합니다.
  2. 형 변환 전 확인: `str.isdigit()`, `re` 모듈 등을 활용해 문자열 형식을 검사합니다.
  3. 리스트·튜플 처리 주의: `in` 연산으로 존재 여부를 확인하거나, `len()`으로 요소 개수를 점검합니다.
  4. 날짜·시간 파싱: `datetime` 모듈 사용 시 `format` 문자열이 입력값과 정확히 일치하는지 확인합니다.
  5. 유닛 테스트 작성: 경계값, 빈값, 잘못된 포맷 등을 포함하는 테스트 케이스를 추가해 조기 발견을 유도합니다.

5. 정리 및 다음 단계

이번 챕터에서는 ValueError의 정의, 대표 발생 사례, 실행 결과 해석 및 디버깅 팁을 살펴보았습니다. 올바른 값 검증과 테스트 자동화로 오류를 예방하고, 발생 시 에러 메시지를 통해 빠르게 문제를 해결해 보세요. 다음 챕터에서는 ZeroDivisionError: 0으로 나누기 문제의 원인과 해결 방법을 다룰 예정이니 많은 기대 부탁드립니다!