Studijní materiály
EXTRA Kontakt

Ošetření vstupu a výjimky

Když píšeme program, často se ptáme uživatele na různé informace nebo zadáváme různé hodnoty do programu. Ale co když uživatel zadá něco, co nečekáme? Například místo čísla zadá písmeno nebo místo možnosti A, B nebo C zadá X. Tady nastupuje ošetření vstupu! Pomocí ošetření vstupu můžeme kontrolovat vstupy od uživatele a reagovat na ně vhodným způsobem.

Ošetření vstupu pro výběr možností

Když požádáme uživatele o výběr z několika možností, musíme kontrolovat, zda vůbec zadá platnou možnost. To mužeme ověřit uvnitř nekonečného cyklu podmínkou s použitím or.

while True:
volba = input("Vyber moznost A, B nebo C: ")
  if volba == 'A' or volba == 'B' or volba == 'C':
    print("Vybral(a) jsi moznost:", volba.upper())
    break
  else:
    print("Neplatna moznost! Zkus to znovu.")

Kontrola číselného vstupu

Když požádáme uživatele, aby zadal číslo, může se stát, že zadá něco jiného než číslo. Například písmeno nebo slovo. To můžeme ošetřit pomocí nekonečného cyklu, který skončí při zadání platného čísla. Načteme od uživatele řetězec a funkcí isdigit zkontrolujeme, zda se jedná o číslo.

while True:
  vstup = input("Zadej cislo: ")
  if vstup.isdigit():
    cislo = int(vstup)
    print("Zadal(a) jsi cislo:", cislo)
    break
  else:
    print("To neni cislo! Zkus to znovu.")

Ošetření vstupu s rozsahem čísel

Můžeme také kontrolovat, zda uživatel zadá číslo v určitém intervalu. To provedeme stejným způsobem, akorát do podmínky přidáme and kontrolující rozsah čísla.

min = 1
max = 10

while True:
  vstup = input("Zadej cislo mezi", min, "a", max)
  if vstup.isdigit and int(vstup) >= min and int(vstup) <= max:
    cislo = int(vstup)
    print("Zadal(a) jsi platne cislo:", cislo)
    break
  else:
    print("Neplatny vstup! Zkus to znovu.")

Výjimky

Pro zachycení chyby lze také použít příkaz try-except. Ukažme si to na příkladu:

def read_int():
  while True:
    vysledek = input("Napis cislo: ")
    try:
      return int(vysledek)
    except:
      print("Spatny vstup, nejedna se o cislo!")

Funkce read_int má za úkol získat od uživatele celé číslo a vrátit ho. Uvnitř této funkce máme nekonečný cyklus, který načítá řetězec do proměnné vysledek. V cyklu je dále blok kódu uvozený příkazem try, který obsahuje pokyny k převedení vstupu na celé číslo pomocí int.

Pokud se podaří převedení vstupu na číslo bez problémů, program tento proces ukončí a vrátí zadané číslo.

Nicméně, pokud uživatel zadá neplatný vstup (například text místo čísla), vznikne výjimka ValueError. V takovém případě se provede blok except. V tomto bloku program vypíše chybové hlášení "To nebylo číslo!" a cyklus se znovu zeptá uživatele na vstup. Tím je zajištěno, že program bude pokračovat v čekání na platný vstup od uživatele, dokud jej nezadá.