Программалауда кездесетін қателер
Дәрігер науқасты емдеу үшін алдымен ДИАГНОЗ қояды: температура ма, қан қысымы ма, әлде мүлдем басқа себеп пе? Программадағы «ауру» — қате — де дәл солай: алдымен қандай ТҮРІ екенін анықтау керек, сосын ғана «емдеу» (түзету) басталады. Бұл сабақта 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) көрсетілген код жолын өзің тексер.
Ал енді ЕҢ ҚИЫН түріне келдік — алгоритмдік (логикалық) қате. Мұнда программа ЕШТЕҢЕ ХАБАРЛАМАЙДЫ — тыныш, «сәтті» жұмыс істейді, БІРАҚ нәтиже ҚАТЕ.
N = int(input()) if (N//10)+(N%10) % 2 == 0: print('jup')Қате: ал ТАҚ болса ше? Кодта else БӨЛІГІ ЖОҚ! Тақ жағдайда код ЕШТЕҢЕ ШЫҒАРМАЙДЫ — тыныш «үнсіз» қалады. Бұл алгоритмнің ТОЛЫҚ ЕМЕС екенін көрсетеді.
Түзету: if... print('jup') else: print('taq') қосу керек — барлық жағдай қамтылуы тиіс.
Алгоритмдік қатені табудың ЖАЛҒЫЗ сенімді жолы — ТРАССИРОВКА мен ТЕСТІЛЕУ: код БАРЛЫҚ жағдайды (жұп та, тақ та; оң да, теріс те; нөл де, үлкен сан да) дұрыс өңдей ме, тексеру. Дәл осы себептен «код жазу — жарты жұмыс, тестілеу — қалған жартысы» деп айтылады.
- Синтаксистік — жазу кезінде, Python дереу көрсетеді.
- Орындалу қатесі/ерекшелік — жұмыс кезінде, Traceback арқылы диагностикаланады: NameError, ValueError, TypeError, ZeroDivisionError.
- Алгоритмдік/логикалық — ЕҢ ҚАУІПТІ: программа жұмыс істейді, бірақ нәтиже қате, тек тестілеу табады.
- Осымен IV бөлімдегі циклдер мен қателерді басқару тақырыптары толық аяқталды.