Python Vadovėlis/Siekiant tobulumo

Iš wiki.angis.net.
Jump to navigation Jump to search
 ← Failų tvarkymas Turinys Įvadas į objektinį programavimą Python 3 → 

...arba, kaip kovoti su klaidomis

Klaidų „gaudymas“ su try

Tarkime, kad jau turi tobulą programą, ji vykdoma nepriekaištingai. Tik viena maža detalė: programa užstringa naudotojui įvedus klaidingą įvestį. Nesijaudink, Pithon'as turi specialią valdymo struktūrą, kuri tau padės. Ji vadinama try ir ji bando kažką padaryti. Programos su problema pavyzdys:

print("Norėdamas uždaryti programą, įvesk -1")
skaicius = 1
while skaicius != -1:
   skaicius = int(input("Įvesk skaičių: "))
   print("Tu įvedei:", skaicius)

Jei įvesi @#&, programa išves kažką tokio:

Traceback (most recent call last):
 File "bandyk.py", line 4, in <module>
  skaicius = int(input("Įvesk skaičių: "))
ValueError: invalid literal for int() with base 10: '\\@#&'

Kaip gali pastebėti, int() funkcijai netinka įvestis @#& (kaip ir turėtų būti). Paskutinė eilutė parodo, kokia yra problema: Python'as rado ValueError klaidą. Kaip mūsų programa gali su tuo susitvarkyti? Visų pirma, tą kodo vietą, kurioje gali būti klaidų, turime įrašyti į try bloką. Antra, turime pasakyti Python'ui, kaip tvarkytis su ValueError klaidomis. Tai daro žemiau esanti programa:

print("Norėdamas uždaryti programą, įvesk -1")
skaicius = 1
while skaicius != -1:
    try:
        skaicius = int(input("Įvesk skaičių: "))
        print("Tu įvedei:", skaicius)
    except ValueError:
        print("Tai buvo ne skaičius.")

Dabar, kai vykdome programą ir įvedame @#&, programa mums pasako, kad Tai buvo ne skaičius. ir toliau vykdo tai, ką turėtų.

Kai tavo programa vis susiduria su ta pačia klaida, kodą apsupk try bloku ir aprašyk būdą, kaip elgtis sutikus klaidą, except.

Pratimai

Pataisyk telefono numerių programą (Žodynai skyriuje), kad ji neužstrigtų, jei naudotojas neįrašo jokios įvesties į meniu.

Sprendimas  
def spausdink_meniu():
    print('1. Spausdink telefonų numerius')
    print('2. Pridėk telefono numerį')
    print('3. Pašalink telefono numerį')
    print('4. Ieškok telefono numerio')
    print('5. Išeik')
    print()

numeriai = {}
meniu_pasirinkimas = 0
spausdink_meniu ()
while meniu_pasirinkimas != 5:
    try:
        meniu_pasirinkimas = int(input("Įvesk skaičių (1-5): "))
        if meniu_pasirinkimas == 1:
            print("Telefono numeriai: ")
            for x in numeriai.keys():
                print("Vardas: ", x, "\tTelefono numeris:", numeriai[x])
            print()
        elif meniu_pasirinkimas == 2:
            print("Pridėk vardą ir telefono numerį")
            vardas = input("Vardas: ")
            numeris = input("Telefono numeris: ")
            numeriai[vardas] = numeris 
        elif meniu_pasirinkimas == 3:
            print("Pašalink vardą ir telefono numerį")
            vardas = input("Vardas: ")
            if vardas in numeriai:
                del numeriai[vardas]
            else:
                print(vardas, " nebuvo rastas")
        elif meniu_pasirinkimas == 4:
            print("Ieškok telefono numerio")
            vardas = input("Vardas: ")
            if vardas in numeriai:
                print("Telefono numeris yra ", numeriai[vardas])
            else:
                print(vardas, " nebuvo rastas")
        elif meniu_pasirinkimas  != 5:
            print_menu()
    except ValueError:
        print("Tai buvo ne skaičius.")
 ← Failų tvarkymas Turinys Įvadas į objektinį programavimą Python 3 →