Лекция · 4.8

Программалауда кездесетін қателер

Дәрігер науқасты емдеу үшін алдымен ДИАГНОЗ қояды: температура ма, қан қысымы ма, әлде мүлдем басқа себеп пе? Программадағы «ауру» — қате — де дәл солай: алдымен қандай ТҮРІ екенін анықтау керек, сосын ғана «емдеу» (түзету) басталады. Бұл сабақта Python қателерінің ТОЛЫҚ каталогымен танысамыз: интерпретатордың нақты хабарламаларын оқуды, олардың мағынасын түсінуді үйренеміз.

Үш қате тобы

Программалауда қате үш «дәрежеде» болуы мүмкін — қаншалықты ерте байқалатынына қарай: 1) Синтаксистік қате — программа ЖАЗЫЛЫП БОЛМАЙ ЖАТЫП-АҚ анықталады, программа ІСКЕ ҚОСЫЛМАЙДЫ. 2) Орындалу қатесі (ерекшелік) — программа ІСКЕ ҚОСЫЛАДЫ, БІРАЗ УАҚЫТ жұмыс істейді, содан кейін КҮТПЕГЕН жағдайда «құлайды». 3) Алгоритмдік қате — программа СОҢЫНА ДЕЙІН ЖҰМЫС ІСТЕЙДІ, нәтиже ДЕ шығарады, БІРАҚ нәтиже ҚАТЕ. Бұл — ЕҢ ҚАУІПТІ түрі, себебі ешкім саған «қате!» демейді.

🚗
Аналогия: автокөлікпен салыстырсақ: синтаксистік қате — қозғалтқыш МҮЛДЕМ ІСКЕ ҚОСЫЛМАЙДЫ (кілт бұрылмайды); орындалу қатесі — жолда бара жатып қозғалтқыш ТОҚТАП ҚАЛАДЫ (бензин таусылды); алгоритмдік қате — көлік ЖҮРІП КЕТЕДІ, БІРАҚ БАСҚА БАҒЫТҚА барады (навигатор қате бағдарлаған).
Синтаксистік қате

Синтаксистік қате (SyntaxError) — ең «жеңіл» түрі, себебі Python ӨЗІ дереу көрсетеді.

>>> fro i in range(10):
SyntaxError: invalid syntax

Мұнда «for» сөзі «fro» деп қате жазылған. Python дәл сол ЖОЛДЫ, тіпті «^» белгісімен ДӘЛ ОРНЫН көрсетеді. Мұндай қатені тексеру ОҢАЙ — хабарламаны оқы, көрсетілген жерге қара.

Анықтама
Синтаксистік қате — тілдің грамматикалық ережесі бұзылғанда пайда болады (жазылмаған кілт сөз, жоқ қос нүкте, дұрыс емес шегіныс); программа МҮЛДЕМ іске қосылмайды.
Орындалу қатесі

Орындалу қатесі (runtime error) — қиынырақ, себебі код СИНТАКСИСІ дұрыс, Python оны ТҮСІНЕДІ, бірақ орындалу барысында КҮТПЕГЕН жағдай кездеседі. Мұны Python-да ерекшелік (exception) дейді. Ең жиі кездесетін төртеуін жаттап ал:

ЕрекшелікНе дегенді білдіредіМысал
NameErrorАйнымалы табылмадыprint(a+b), b жоқ
ValueErrorМән дұрыс емесint('Hi')
TypeErrorТиптер сәйкес келмейді8 + '3'
ZeroDivisionErrorНөлге бөлу1/0

Python қатені хабарлағанда, Traceback (соңғы шақыру тізбегі) деп аталатын толық есеп береді:

Traceback (most recent call last):
  File '<stdin>', line 2, in <module>
    print(a + b)
NameError: name 'b' is not defined

Оқу тәртібі: 1) соңғы жолды оқы — қате ТҮРІ мен қысқаша сипаттамасы сонда; 2) line 2 — қате КАЙ жолда; 3) көрсетілген код жолын өзің тексер.

📋
Аналогия: Traceback — полиция ЖОЛ-ЖОБАСЫ сияқты: «оқиға қай жерде, қашан, не себепті болды» — бәрі тізбектеле жазылған. Ең соңғы жол — «нәтиже» (диагноз), одан жоғарғылар — «қалай осыға жеткенінің» тарихы.
Алгоритмдік қате

Ал енді ЕҢ ҚИЫН түріне келдік — алгоритмдік (логикалық) қате. Мұнда программа ЕШТЕҢЕ ХАБАРЛАМАЙДЫ — тыныш, «сәтті» жұмыс істейді, БІРАҚ нәтиже ҚАТЕ.

Мысал: екітаңбалы санның цифрлар қосындысының жұп екенін тексереді.
N = int(input())
if (N//10)+(N%10) % 2 == 0:
    print('jup')
Қате: ал ТАҚ болса ше? Кодта else БӨЛІГІ ЖОҚ! Тақ жағдайда код ЕШТЕҢЕ ШЫҒАРМАЙДЫ — тыныш «үнсіз» қалады. Бұл алгоритмнің ТОЛЫҚ ЕМЕС екенін көрсетеді.
Түзету: if... print('jup') else: print('taq') қосу керек — барлық жағдай қамтылуы тиіс.
⚠️
Алгоритмдік қатенің белгісі: программа ҚАТЕСІЗ жұмыс істейді, БІРАҚ КЕЙБІР жағдайларда КҮТПЕГЕН (немесе МҮЛДЕМ бос) нәтиже береді. Мұны тек ТЕСТІЛЕУ арқылы табуға болады.

Алгоритмдік қатені табудың ЖАЛҒЫЗ сенімді жолы — ТРАССИРОВКА мен ТЕСТІЛЕУ: код БАРЛЫҚ жағдайды (жұп та, тақ та; оң да, теріс те; нөл де, үлкен сан да) дұрыс өңдей ме, тексеру. Дәл осы себептен «код жазу — жарты жұмыс, тестілеу — қалған жартысы» деп айтылады.

🎯 ҰБТ байланысы
Қателер бойынша тексерілетін дағды.
1
Кодтағы қате түрін ажырату: программа МҮЛДЕМ жұмыс істемей ме, «құлай ма», әлде дұрыс жұмыс істеп ҚАТЕ жауап бере ме.
2
Ерекшелік атауын дұрыс тану: NameError (айнымалы жоқ), ValueError (мән түрлендірілмейді), TypeError (типтер сәйкес емес), ZeroDivisionError (нөлге бөлу).
3
Traceback хабарламасынан қатенің орны мен түрін тез табу.
Сабақ қорытындысы
  • Синтаксистік — жазу кезінде, Python дереу көрсетеді.
  • Орындалу қатесі/ерекшелік — жұмыс кезінде, Traceback арқылы диагностикаланады: NameError, ValueError, TypeError, ZeroDivisionError.
  • Алгоритмдік/логикалық — ЕҢ ҚАУІПТІ: программа жұмыс істейді, бірақ нәтиже қате, тек тестілеу табады.
  • Осымен IV бөлімдегі циклдер мен қателерді басқару тақырыптары толық аяқталды.