3.4 Kļūdu apstrāde un validācija
Stundas uzdevums: Paredzēt lietotāja kļūdas, izstrādāt drošu ievades sistēmu un novērst programmas avārijas, izmantojot koda atkļūdošanas un validācijas metodes.
70 min plāns: Teorija un paraugs (~10 min) · 1. uzdevums (~15 min) - noķer ValueError ar try/except · 2. uzdevums (~25 min) - uzbūvē drošu ievadi ciklā · 3. uzdevums (~20 min) - pievieno vērtību validāciju un iztestē. Papildu uzdevumu sāc tikai tad, ja pārējie trīs ir gatavi.
Pirms sāc: atver VS Code un izveido failu validacija.py. Noderēs 3.3 stundas while True un continue.
Teorija: Izņēmumu apstrāde (Exceptions Handling)
Programmēšanā negaidītas kļūdas sauc par Exceptions (Izņēmumiem). Tā vietā, lai ļautu programmai "uzkārties", mēs šīs kļūdas pārtveram un apstrādājam.
- Try block (Mēģinājuma bloks): Koda daļa, kurā varētu notikt kļūda (piemēram, datu konvertācija). Dators "mēģina" šo kodu izpildīt.
- Except block (Izņēmuma bloks): Drošības tīkls, kas aktivizējas TIKAI tad, ja
tryblokā rodas kļūda. - ValueError (Vērtības kļūda): Specifisks izņēmuma tips, kas rodas, kad mēģinām pārvērst neatbilstošu String (Simbolu virkni) par matemātisku skaitli.
# Īss kļūdu apstrādes paraugs
try:
vecums = int(input("Cik Tev gadu? "))
print(f"Tev ir {vecums} gadi.")
except ValueError:
print("Kļūda! Lūdzu, ievadi tikai ciparus.")
Praktiskie uzdevumi
1. uzdevums -
Noķer ValueError ar try/except
Beigās programma vairs neavarēs, ja lietotājs ievadīs burtus.
- Ieraksti
likme = float(input("Ievadi likmi: "))un palaid ar vārduabc. - Pieraksti, kā sauc kļūdu, kas parādījās.
- Ieliec šo rindu
try:blokā ar atkāpi. - Pievieno zem tā
except ValueError:. - Ieraksti zem tā izdruku
Kļūda! Ievadi skaitli.. - Palaid vēlreiz ar
abc.
Gatavs, kad: programma izdrukā tavu paziņojumu un beidzas mierīgi, bez sarkanā teksta.
2. uzdevums -
Uzbūvē drošu ievadi ciklā
Beigās programma prasīs skaitli tik ilgi, kamēr to tiešām saņems.
- Ieliec visu
try/exceptbloku iekšāwhile True:ciklā. - Pievieno
trybloka beigās komandubreak. - Pārliecinies, ka
breakir tikai tad, ja konvertācija izdevās. - Palaid un ievadi
abc, tadxyz, tad 2.5. - Pārbaudi, ka pēc 2.5 programma iziet no cikla.
- Izdrukā pēc cikla ievadīto vērtību.
Gatavs, kad: programma prasa atkārtoti, kamēr ievadi burtus, un turpinās tikai pēc derīga skaitļa.
3. uzdevums -
Pievieno vērtību validāciju un iztestē
Beigās programma noraidīs arī tehniski derīgus, bet bezjēdzīgus skaitļus.
- Pievieno pēc konvertācijas pārbaudi
if likme <= 0:. - Ieraksti zem tā izdruku
Likmei jābūt pozitīvai!uncontinue. - Palaid un ievadi
-5. - Palaid un ievadi
0. - Palaid un ievadi
abc, lai pārbaudītu, ka arīexceptvēl strādā. - Palaid un ievadi
2.5, lai pārbaudītu derīgu gadījumu. - Pieraksti vienu secinājumu: ar ko
exceptpārbaude atšķiras noifpārbaudes.
Gatavs, kad: programma noraida gan burtus, gan nulli, gan negatīvus skaitļus, bet pieņem 2.5.
Papildu uzdevums - Ierobežo mēģinājumu skaitu
Ja pamatdarbs ir gatavs, neļauj lietotājam kļūdīties bezgalīgi.
- Ieraksti pirms cikla
meginajumi = 3. - Samazini to par vienu katrā neveiksmīgā mēģinājumā.
- Pievieno nosacījumu, kas pārtrauc ciklu, kad mēģinājumi beidzas.
- Izdrukā paziņojumu, ka mēģinājumi izsmelti.
- Palaid un ievadi burtus trīs reizes pēc kārtas.
Gatavs, kad: pēc trešās nepareizās ievades programma beidzas ar tavu paziņojumu, nevis prasa vēl.
Biežākās kļūdas (un kā tās labot):
- Bare except (Tukšs izņēmums): Nekad neizmanto atslēgvārdu
except:bez norādīta kļūdas tipa, jo tas noķers pilnīgi visas kļūdas, pat tās, kas saistītas ar paša koda sintakses problēmām vai programmas piespiedu apturēšanu (Ctrl+C).# Slikti: except: print("Notika kļūda.") # Labi: except ValueError: print("Datu tipa kļūda.") - Bloated try block (Pārpildīts mēģinājuma bloks): Iekš
tryliec tikai tās rindiņas, kas reāli var izraisīt norādīto kļūdu.# Slikti: try: vards = input("Vārds: ") # Šeit ValueError nevar notikt vecums = int(input("Vecums: ")) except ValueError: print("Kļūda!") # Labi: vards = input("Vārds: ") try: vecums = int(input("Vecums: ")) except ValueError: print("Kļūda!") - Missing break (Aizmirsta pārtraukšana): Ja, ievietojot
try/exceptbezgalīgajā ciklā, aizmirsīsi pieliktbreakveiksmīgas izpildes gadījumā, cikls turpināsies mūžīgi.
Koda piemērs: Profesionāla ievade
while True:
try:
likme = float(input("Ievadi likmi: "))
# Validācijas loģika
if likme <= 0:
print("Likmei jābūt pozitīvai!")
continue # Sākam no jauna
# Ja viss ir pareizi, izejam no cikla
break
except ValueError:
print("Kļūda! Ievadi skaitli, izmantojot punktu (piem., 5.5).")
print(f"Likme {likme} pieņemta!")
Kļūda! Ievadi skaitli, izmantojot punktu (piem., 5.5).
Ievadi likmi: -10
Likmei jābūt pozitīvai!
Ievadi likmi: 10.5
Likme 10.5 pieņemta!