더북(TheBook)

이 예제에서 문제가 되는 부분은 한 칸을 들여쓴 두 번째 줄이다. 하지만 오류 메시지는 y를 가리키고 있어서 오해하기 쉽다. 일반적으로 오류 메시지는 문제가 발견된 곳을 가리키지만, 실제 오류가 발생한 부분은 코드에서 앞부분일 수 있고, 때로는 이전 줄일 수도 있다.

이런 문제는 런타임 오류에서도 발생한다. 신호대잡음비(Signal-to-Noise Ratio, SNR)를 데시벨 단위로 계산하려 한다고 하자. 이를 계산하는 공식은 SNRdb=10log10(Psignal/Pnoise)라고 하자. 파이썬으로 다음과 같은 코드를 작성했을 것이다.

import math

signal_power = 9

noise_power = 10

ratio = signal_power // noise_power

decibels = 10 * math.log10(ratio)

print(decibels)

프로그램을 실행하면 다음과 같은 예외를 얻게 된다.

Traceback (most recent call last):

File "snr.py", line 5, in ?

decibels = 10 * math.log10(ratio)

ValueError: math domain error

오류 메시지는 5번 줄을 가리키지만, 해당 줄에는 잘못된 것이 없다. 진짜 오류를 찾으려면 ratio의 값을 print로 확인해봐야 하고, 이 값이 0이라는 것을 알 수 있다. 문제는 4번 줄에 있다. 4번 줄은 부동소수점 나눗셈 대신 몫 연산을 사용했다.

오류 메시지는 시간을 들여 주의 깊게 읽어야 하지만, 오류 메시지가 모두 올바르다고 가정해서는 안 된다.

신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.