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.
Š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.
Š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.
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.
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.
Š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.
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: Arba, jei užmiršite kabutes, teksto žodžiai gali būti suprasti, kaip kintamieji: Arba iš tikrųjų užmiršote apibrėžti kintamąjį (priskirti jam reikšmę), prieš naudodami ;)
- dalyba iš nulio. Kaip ir matematikoje, dalyba iš nulio nėra įmanoma.
- veiksmai su netinkamais duomenų tipais
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]
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:
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į
Ar programa veiks?
Vidurkis turėtų būti
bet programa atspausdina 5.0
! Ši klaida atsitiko dėl aritmetikoje naudojamos veiksmų tvarkos. x + y / 2
, reiškia . Š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. |