교재 홈: 바이브 코더를 위한 코딩 기초 학습
**오류(error)**는 코드가 실행되지 않거나 요구와 다르게 동작하는 문제입니다. 문제를 찾아 원인을 좁히고 수정하는 일을 **디버깅(debugging)**이라고 합니다. 화면의 빨간 글씨를 없애는 것만으로 해결을 판단하지 않습니다. 같은 입력으로 다시 실행하여 요구한 결과가 나오는지 확인합니다.
구문은 코드를 적는 문법의 형식입니다. 실행 오류는 코드를 수행하다가 생기는 실패, 논리 오류는 실행되더라도 처리 기준이나 계산이 요구와 다른 경우입니다. **예외(exception)**는 정상 진행이 어려운 상황을 코드에 알리는 신호이며, 어떤 종류인지에 따라 처리할 수 있습니다. 표의 0으로 나누기는 나누는 수가 0인 계산으로, 일반적인 숫자 결과를 정할 수 없어 여기서는 오류로 취급합니다.
| 종류 | 예시 | 첫 확인 지점 |
|---|---|---|
| 구문 오류 | 콜론 누락, 잘못된 들여쓰기 | 표시된 줄과 바로 앞줄의 문법 |
| 실행 오류 | 없는 파일, 잘못된 숫자 변환, 0으로 나누기 | 예외 유형, 실제 입력, 경로와 환경 |
| 논리 오류 | 평균의 분모가 틀림, 경계값 제외 | 명세와 예상 결과, 중간 상태 |
구문 오류는 보통 해당 파일을 실행할 수 있는 형태로 해석하는 단계에서 발견됩니다. 실행 오류는 특정 문장을 수행할 때 예외(exception)로 나타납니다. 논리 오류는 프로그램이 끝까지 실행돼도 남을 수 있습니다. 테스트가 필요한 이유가 여기에 있습니다.
**Traceback(트레이스백)**은 오류가 생긴 지점까지 어떤 코드와 함수 호출을 거쳤는지 보여 주는 기록입니다. 호출은 함수에 일을 시키는 것이고, 호출 기록은 그 순서를 보여 줍니다. 화면에 영어가 많이 나와도 모든 줄을 번역하기보다 오류 종류, 파일명, 위치, 문제가 된 값부터 찾습니다.
다음은 의도적으로 실패하는 코드입니다. error_demo.py에 저장해 실행합니다.
def read_minutes(text):
return int(text)
print(read_minutes("abc"))
마지막 줄에는 ValueError: invalid literal for int() with base 10: 'abc'와 비슷한 메시지가 나옵니다. ValueError는 받은 값이 요구에 맞지 않는다는 뜻이고, 뒤의 글은 abc를 정수로 읽을 수 없다는 설명입니다. base 10은 평소 쓰는 0~9 숫자를 이용하는 십진 표기로 읽으려 했다는 뜻입니다. 지금은 진법 계산을 배울 필요 없이 ‘어떤 값을 무엇으로 바꾸려다 실패했는가’를 찾으면 됩니다. 위치나 표현은 Python 버전에 따라 조금 달라질 수 있습니다.
오류 메시지의 마지막 줄에서 예외 유형과 설명을 읽고, 그 위의 호출 기록(traceback)을 따라 자신이 작성한 파일의 위치를 찾습니다. 가장 아래에 나온 줄이 원인을 만든 유일한 줄이라는 보장은 없습니다. 앞 단계에서 잘못된 값이 들어왔을 수 있으므로 그 변수의 출처도 추적합니다.
ModuleNotFoundError는 패키지 미설치뿐 아니라 잘못 선택한 Python 환경이나 파일명 문제일 수도 있습니다. PermissionError가 나오면 무조건 관리자 권한으로 실행하기보다, 쓰려는 위치와 기존 파일의 사용 상태를 확인합니다.
**재현(reproduction)**은 같은 조건과 입력으로 같은 현상이 다시 나타나게 하는 것입니다. 문제를 일으키는 조건을 남기되 관련 없는 부분을 줄인 입력을 최소 입력이라고 합니다. 원인 후보는 아직 확인되지 않았지만 문제를 설명할 수 있는 가설입니다. 후보를 사실로 단정하기 전에 아래 정보를 모아 다시 실행해 봅니다.