[TIL] 오류 메시지를 읽고 최소 재현 예제로 줄이는 방법

차곡코딩·2일 전

TIL · 학습 복습

목록 보기
5/5

오류가 발생했을 때 전체 코드를 한꺼번에 바꾸면 원인을 확인하기 어려워집니다. 수정 후 정상 실행되더라도 어떤 변경이 문제를 해결했는지 설명하기 힘들 수 있어요.

이번에는 짧은 예제를 통해 오류를 재현하고, 관련 없는 부분을 줄인 다음 수정 이유를 검증하는 흐름을 정리합니다. 아래 코드는 설명을 위해 만든 예제입니다.

예외 종류와 실패한 연산부터 확인합니다

scores = [80, "90"]
try:
    print(sum(scores))
except TypeError as error:
    print(type(error).__name__)
TypeError

합계 계산에 정수와 문자열이 섞여 있습니다. 실제 프로그램의 traceback에서는 마지막 줄의 예외 종류와 메시지를 읽고, 그 위에서 자신의 코드가 실패한 위치를 확인하면 됩니다. 마지막 줄만으로 모든 원인을 알 수 있는 것은 아니므로 호출 경로도 함께 봐야 해요.

예제의 try/except는 오류 종류를 일정한 출력으로 보여주기 위한 것입니다. 실제 진단에서는 원본 traceback을 먼저 보존합니다.

같은 오류가 남는 가장 작은 입력을 만듭니다

이 문제가 긴 CSV 처리 과정에서 발생했더라도, 파일 전체가 재현에 꼭 필요한 것은 아닐 수 있습니다. 오류를 일으키는 값과 연산만 남겨 [80, "90"]과 sum()으로 줄여볼 수 있어요.

단, 코드를 줄인 뒤에도 원래와 같은 실패가 발생하는지 매 단계 확인해야 합니다. 다른 종류의 오류가 생겼다면 원래 문제를 재현한 것으로 볼 수 없습니다.

재현 예제를 공유할 때는 비밀번호, 토큰, 실제 고객 정보 등을 가상의 값으로 바꿉니다. 오류에 영향을 주는 자료형과 구조는 유지해야 합니다.

변환이 맞는지는 입력의 의미에 달려 있어요

def total_score(values):
    return sum(int(value) for value in values)

print(total_score([80, "90"]))
print(total_score([]))
170
0

이 수정은 정수 또는 정수로 표현된 문자열을 허용한다는 전제에서 사용할 수 있습니다. 소수 점수를 허용한다면 정수 변환은 적절하지 않을 수 있어요. 입력이 반드시 정수여야 한다면 문자열을 조용히 바꾸기보다 잘못된 입력으로 거부하는 설계가 더 맞을 수도 있습니다.

정상 사례와 실패 사례를 함께 남깁니다

assert total_score([80, "90"]) == 170
assert total_score([]) == 0

try:
    total_score([80, "unknown"])
except ValueError:
    print("invalid score")
else:
    raise AssertionError("invalid input was accepted")
invalid score

오류를 없애기 위해 무조건 0을 넣거나 모든 예외를 무시하면 잘못된 값이 정상 결과에 섞일 수 있습니다. 수정의 목표는 예외가 보이지 않게 만드는 것이 아니라, 입력 규칙에 맞게 처리하는 것입니다.

다음에 남길 디버깅 기록

기대 결과, 실제 결과, 최소 입력, 예외 메시지, 실행 환경을 함께 적어 두려고 합니다. 수정한 뒤에는 재현 예제가 해결되었는지와 기존 정상 입력이 여전히 통과하는지를 확인합니다. 이렇게 남긴 작은 사례는 같은 오류가 다시 생기는지 확인하는 회귀 테스트로도 사용할 수 있어요.

참고

profile
비전공자의 개발 성장 기록. 바이브코딩 프리랜서 경험부터 Python·SQL·AI 서비스 개발까지

0개의 댓글