1E: Errors - klaidos

Programuodami „sutiksite“ daug klaidų. Klaidų „gaminimas“, jų išsiaiškinimas ir taisymas yra natūrali programavimo dalis. Pitonas bandys vykdyti visus jūsų pageidavimus (komandas), tačiau kartais jis gali kažko nesuprasti... ir parodys klaidos pranešimą. Pagal pranešimą galima atsekti, kur ir kodėl nutiko klaida.

Štai du klaidos pavyzdžiai.

Pavyzdys: Sintaksės klaida (Syntax Error)

Šiame pavyzdyje mes užmiršome panaudoti skliaustelius. To užtenka, kad Pitonas  nesuprastų, ko norime (Python 2-trojoje versijoje tai buvo įprastas būdas spausdinti, bet 3-čioje reikia skliaustelių).

Dar viena Pitono klaida.

Pavyzdys: Vykdymo klaida (Runtime Error)

Šiame pavyzdyje mes pamiršome apibrėžti greeting kintamąjį (priskirti jam reikšmę), arba pamiršome kabutes. Pitonas žinotų, ką norime su juo padaryti, bet, nežino, kas tas greeting.

Sintaksės klaida atsitinka, kai Pitonas nesupranta kažkurios komandos užrašymo. Vykdymo klaida atsitinka, kai Pitonas supranta komandas, tačiau negali jų įvykdyti dėl kažkokių aplinkybių.

Lietuvių kalboje sintaksės klaidos  pvz. galėtų būti:

Prašau katės gyvatė katės.
Aš miegu pavargau, nes.

Šio sakinio struktūra nėra teisinga. Tuo tarpu vykdymo klaida būtų sakinys.

Prašau suvalgyti pianiną.

Sakinio sintaksė ir gramatika teisinga. Tačiau pradėję valgyti pianiną, susidursime su problema. Šią klaidą vadiname vykdymo klaida („Runtime Error“), nes ją pastebime, kai programa jau vyksta.

Pačios klastingiausios yra loginės klaidos. Programa bus įvykdyta, tačiau rezultatas bus ne toks, kokio tikėjomės. Tokios programos pavyzdys galėtų būti sakinys

Uždaryki duris, kad saulė anksčiau patekėtų.

Tai yra klaida, kadangi saulės patekėjimo laikas nepriklauso nuo to, ar durys yra uždarytos.

Sintaksės klaidų pavyzdžiai

Visų pirma, Pitonas gali aptikti simbolį, kurio toje vietoje nesitikėjo.

Pavyzdys: netinkamas simbolis

Pitonas sako SyntaxError: invalid syntax ir nurodo (su ^), kad problema yra susijusi su  !. Šauktukas Pitone neturi jokios prasmės. Sintaksės klaida dingtų jei programą pataisytume į print("Hello, World!"). Tokiu atveju Pitonas suprastų, kad ! yra teksto Hello, World dalis.

Štai šiek tiek subtilesnė sintaksės klaida.

Pavyzdys: bazinis terminas kaip kintamojo vardas

Problema tame, kad class yra specialus Pitono terminas, ir jo negalima naudoti kitiems reikalams (pvz, kintamojo vardui). Pakeitę class į course išvengtume klaidos. Paspauspkite čia, kad pamatytumėte visus specialius Pitono bazinius terminus.

Jei naudojate kabutes, bet pamirštate jas uždaryti taip pat bus sintaksės klaida.

Pavyzdys: užmiršta uždaranti kabutė

Šioje klaidoje, EOL reiškia "End Of Line" (eilutės pabaiga): Pitonas tikėjosi, kad panaudodami " uždarysite atidarytas kabutes toje pačioje eilutėje.

Pavyzdys: užmirštas uždarantis skliaustas

Panašiai, EOF reiškia "End Of File" (failo pabaiga): Pitonas ieškojo uždarančio skliausto ), tačiau programa baigėsi be uždarymo.

Prisiminkite, kiekvienas klaidos pranešimas leidžia mums tą klaidą ištaisyti. Būkime atidūs tiek rašydami programos kodą, tiek sekdami klaidos pranešimų pėdomis.

Vykdymo klaidos

Pamenate, Pitonas gali suprasti, ką norime padaryti, tačiau susiduria su problemomis įvykdydamas mūsų instrukcijas.

  • neapibrėžto kintamojo naudojimas. Tai gali atsitikti jei keičiate mažąsias ir didžiąsias raides:
    Pavyzdys: nerastas kintamasis (dėl rašybos klaidos)
    Arba, jei užmiršite kabutes, teksto žodžiai gali būti suprasti, kaip kintamieji:
    Pavyzdys: nerastas kintamasis (dėl užmirštų kabučių)
    Arba iš tikrųjų užmiršote apibrėžti kintamąjį (priskirti jam reikšmę), prieš naudodami ;)
    Pavyzdys: nerastas kintamasis
  • dalyba iš nulio. Kaip ir matematikoje, dalyba iš nulio nėra įmanoma.
    Pavyzdys: dalyba iš nulio
  • veiksmai su netinkamais duomenų tipais
    Pavyzdys: teksto ir skaičių sudėtis

Naudodami Pitona aptiksite daug būtų, kaip „sukurti“ klaidas.

Kuo skiriasi sintaksės ir vykdymo klaidos? Išbandykime abi programas. [pyExample title='Vykdymo klaida='print("Here is some text")\nprint(1/0)'] [/pyExample]
Pavyzdys: Sintaksės klaida
Programa su vykdymo klaida kažką nuveikė (atspausdino eilutę). Tuo tarpu sintaksės klaidą turinti programa net nepradėjo veikti. Taip yra todėl, kad Pitonas supranta programą dviem etapais:

  1. analizuoja programos struktūrą, patikrina užrašymo sintaksę.
  2. neradus sintaksės klaidų, programa yra paleidžiama.

Taigi, programa su sintaksės klaidomis nebus paleidžiama, tuo tarpu vykdymo klaidos randamos tik programos vykdymo eigoje. Vykdymo klaidas sunkiau pastebėti, nes priklausomai nuo duomenų, jos gali nutikti arba ne (pvz, dalyba iš nulio įvyks tik, kai kintamasis bus 0).

Loginės klaidos

Programa gali veikti nestrigdama (jei joje nėra sintaksės ir vykdymo klaidų), tačiau vis tiek grąžinti mums klaidingą rezultatą. Tarkime, norime programos kuri suskaičiuoja dviejų skaičių, x iry, vidurkį

\displaystyle{\frac{x+y}{2}}

Ar programa veiks?

Pavyzdys
Ši programa vidurkį skaičiuoja neteisingai.

Vidurkis turėtų būti

\displaystyle{\frac{x+y}{2}=\frac{3+4}{2}=\frac{7}{2}=3.5}

bet programa atspausdina 5.0!  Ši klaida atsitiko dėl aritmetikoje naudojamos veiksmų tvarkos. x + y / 2, reiškia x + (y / 2) = 3 + (4 / 2) = 3 + 2 = 5. Šią klaidą galime ištaisyti, panaudodami skliaustus -- perrašydami  average = (x + y) / 2, nes pirma norime sudėti, o tik tada padalinti.

Logines klaidas gali būti sunku pastebėti, ypač ilgesnėse programose. 6D  pamokoje sužinosime, kaip išvengti loginių klaidų.

Pratimai

Štai trys pratimai programavimo klaidų taisymui (angl. "debugging"). Klaidas galite aptikti dar nepaleidę programos arba pagal paleistos programos pranešimus.

Kiekvienoje programoje yra kažkoks kodas. Jums tereikia pakeisti keletą simbolių. ”Vertinitojas” nepripažins programų, kuriose bus pakeista per daug simbolių. Spustelkite "Grąžinti pradinį kodą", jei norite pradėti iš naujo.

Programavimo pratimas: Sumavimas
Ištaisykite sintaksės klaidą. Programa turi atspausdinti sumą skaičių nuo 1 iki 10. Galite pakeisti tik vieną simbolį.

Programavimo pratimas: Hello Joe
Ištaisykite vykdymo klaidą: pirmoje eilutėje programa turi atspausdinti Hello, o antroje - Joe. Galite pakeisti du simbolius.

Programavimo pratimas: Apsipirkinėjame
Einate į parduotuvę pirkti miesos ir pieno, bet pasirodo, šiems produktams yra papildomas mokestis (antiakcija :/). Jūs perkate pieno už 2 Lt ir mėsos už 4 Lt, ir dar papildomai sumokate 3% mokestį. Atspausdinkite visą pirkinių kainą (valiutos ženklo spausdinti nereikia). Galite pakeisti 3 simbolius. Užuomina