ebSkola

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.

2.4.10. Veic programmas atkļūdošanu un testēšanu. 2.4.13. Lieto mainīgos, datu tipus un pamatkonstrukcijas.

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 try blokā 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.

  1. Ieraksti likme = float(input("Ievadi likmi: ")) un palaid ar vārdu abc.
  2. Pieraksti, kā sauc kļūdu, kas parādījās.
  3. Ieliec šo rindu try: blokā ar atkāpi.
  4. Pievieno zem tā except ValueError:.
  5. Ieraksti zem tā izdruku Kļūda! Ievadi skaitli..
  6. 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.

  1. Ieliec visu try/except bloku iekšā while True: ciklā.
  2. Pievieno try bloka beigās komandu break.
  3. Pārliecinies, ka break ir tikai tad, ja konvertācija izdevās.
  4. Palaid un ievadi abc, tad xyz, tad 2.5.
  5. Pārbaudi, ka pēc 2.5 programma iziet no cikla.
  6. 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.

  1. Pievieno pēc konvertācijas pārbaudi if likme <= 0:.
  2. Ieraksti zem tā izdruku Likmei jābūt pozitīvai! un continue.
  3. Palaid un ievadi -5.
  4. Palaid un ievadi 0.
  5. Palaid un ievadi abc, lai pārbaudītu, ka arī except vēl strādā.
  6. Palaid un ievadi 2.5, lai pārbaudītu derīgu gadījumu.
  7. Pieraksti vienu secinājumu: ar ko except pārbaude atšķiras no if pā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.

  1. Ieraksti pirms cikla meginajumi = 3.
  2. Samazini to par vienu katrā neveiksmīgā mēģinājumā.
  3. Pievieno nosacījumu, kas pārtrauc ciklu, kad mēģinājumi beidzas.
  4. Izdrukā paziņojumu, ka mēģinājumi izsmelti.
  5. 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š try liec 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/except bezgalīgajā ciklā, aizmirsīsi pielikt break veiksmī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!")
Ievadi likmi: pieci
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!