Knyga/Siekiant tobulumo: Skirtumas tarp puslapio versijų
(Naujas puslapis: {{navigation |previous=Modulių naudojimas |next=Įvadas į objektinį programavimą Python 3}} === ...arba, kaip kovoti su klaidomis === === Klaidų „gaudymas“ su <code>try</code> === 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 <code>try</code> ir ji bando kažką padary...) |
Nėra keitimo santraukos |
||
| 1 eilutė: | 1 eilutė: | ||
{{navigation |previous=Modulių naudojimas |next=Įvadas į objektinį programavimą Python 3}} | {{navigation |previous=Modulių naudojimas |next=Įvadas į objektinį programavimą Python 3}} | ||
=== ...arba, kaip tvarkytis su klaidomis === | |||
=== Ką išmoksi šiame skyriuje? === | |||
* Kodėl programos kartais užstringa dėl klaidingos įvesties | |||
* Kas yra <code>try</code> ir <code>except</code> blokai | |||
* Kaip „pagauti“ klaidą ir neleisti programai užstrigti | |||
* Kaip pritaikyti klaidų tvarkymą praktikoje (pvz., telefono numerių programoje) | |||
=== Klaidų „gaudymas“ su <code>try</code> === | === Klaidų „gaudymas“ su <code>try</code> === | ||
Tarkime, kad jau turi tobulą programą, ji vykdoma nepriekaištingai. Tik viena maža detalė: programa užstringa naudotojui įvedus klaidingą įvestį. Nesijaudink, | Tarkime, kad jau turi tobulą programą, ji vykdoma nepriekaištingai. Tik viena maža detalė: programa užstringa naudotojui įvedus klaidingą įvestį. Nesijaudink, Python'as turi specialią valdymo struktūrą, kuri tau padės. Ji vadinama <code>try</code> ir ji bando kažką padaryti. Programos su problema pavyzdys: | ||
<syntaxhighlight lang="python"> | <syntaxhighlight lang="python"> | ||
print("Norėdamas uždaryti programą, įvesk -1") | print("Norėdamas uždaryti programą, įvesk -1") | ||
| 32 eilutė: | 39 eilutė: | ||
</syntaxhighlight> | </syntaxhighlight> | ||
Dabar, kai vykdome programą ir įvedame <code>@#&</code>, programa mums pasako, kad | Dabar, kai vykdome programą ir įvedame <code>@#&</code>, 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 <code>try</code> bloku ir aprašyk būdą, kaip elgtis sutikus klaidą, <code>except</code>. | Kai tavo programa vis susiduria su ta pačia klaida, kodą apsupk <code>try</code> bloku ir aprašyk būdą, kaip elgtis sutikus klaidą, <code>except</code>. | ||
💡 <code>except</code> gali būti naudojamas su įvairiomis klaidomis – ne tik ValueError. Pvz., ZeroDivisionError, FileNotFoundError ir kt. | |||
💡 Kai nori pagauti bet kokią klaidą, galima rašyti except Exception as e:, bet pradedantiesiems rekomenduojama gaudyti konkrečias klaidas. | |||
=== Pratimai === | === Pratimai === | ||
Pataisyk telefono numerių programą ([[ | Pataisyk telefono numerių programą ([[Knyga/Žodynai|Žodynai]] skyriuje), kad ji neužstrigtų, jei naudotojas neįrašo jokios įvesties į meniu. | ||
{| class="mw-collapsible mw-collapsed wikitable" | {| class="mw-collapsible mw-collapsed wikitable" | ||
! colspan=2 | Sprendimas | ! colspan=2 | Sprendimas | ||
Dabartinė 16:24, 15 rugsėjo 2025 versija
...arba, kaip tvarkytis su klaidomis
Ką išmoksi šiame skyriuje?
- Kodėl programos kartais užstringa dėl klaidingos įvesties
- Kas yra
tryirexceptblokai - Kaip „pagauti“ klaidą ir neleisti programai užstrigti
- Kaip pritaikyti klaidų tvarkymą praktikoje (pvz., telefono numerių programoje)
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, Python'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 = float(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 = float(input("Įvesk skaičių: "))
ValueError: could not convert string to float: '@#&'
Kaip gali pastebėti, float() 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 = float(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.
💡 except gali būti naudojamas su įvairiomis klaidomis – ne tik ValueError. Pvz., ZeroDivisionError, FileNotFoundError ir kt.
💡 Kai nori pagauti bet kokią klaidą, galima rašyti except Exception as e:, bet pradedantiesiems rekomenduojama gaudyti konkrečias klaidas.
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.")
| |