Vodič za Pajton 2.6/Suočavanje sa nesavršenostima

Izvor: Викикњиге

...ili kako rukovati greškama[uredi]

Dakle sada imate savršeni program, radi besprekorno, osim jednog detalja, program će srušiti unos korisnika koji nije dobar. Ne plašite se, za Pajton imamo posebnu kontrolnu strukturu za vas. Zove se покушај i pokušava da uradi nešto. Ovde je primer programa sa problemom:

print "Куцајте Control C или -1 да изађете"
број = 1
while број != -1:
    број = int(raw_input("Унесите број: "))
    print "Унели сте:", број

Primetite kako kada pritisnete @#& vraća nešto kao:

Траг (најдубљи последњи):
 Фајл "пробај_мање.py", линија 4, у ?
    број = int(raw_input("Унеси број: "))</source>

Грешка вредности: буквално неважећа за int(): @#&

Kao što možete da vidite int() funkcija se ne slaže sa brojevima @#& (kako bi i trebalo da bude). Poslednja linija pokazuje šta je problem; Pajton je pronašao ValueError. Kako naš program može da se nosi sa ovim? Šta radimo je prvo: stavi na mesto gde se odvija greška u try blok, i drugo: kažemo Pajtonu kako želimo da se nosi sa ValueErrors. Sledeći program radi ovo:

print "Куцај Control C или -1 за излаз"
број = 1
while број != -1:
    try:
        број = int(raw_input("Унесите број: "))
        print "Унели сте број:", број
    except ValueError:
        print "То није био број."

Sada kada pokrenemo novi program i date @#& govori nam "To nije bio broj." nastavlja sa onim što je radio ranije.

Kada vaš program nastavlja da ima neke greške za koje znate kako da ih rešite, stavite kod u try blok, i stavite način da rukujete greškom except blokom.

Ovde je složeniji primer Rukovanja greškama.

# Програм од стране Мишел Ајкинс 2012
# Нема ауторских права.
import math

def главни():
	успех = 0
	while (успех == 0):
		try:
			epact()
			успех = 1
		except ValueError:
			print "Грешка. Молимо вас, унесите цео број."
			година = 0
		except NameError:
			print "Грешка. Молимо вас, унесите цео број."
			година = 0
		except SyntaxError:
			print "Грешка. Молимо вас, унесите цео број."
			година = 0
		finally:
			print "Завршен програм"

def epact():
    
    година = int(input("Која је година?\n"))
    C = година/100
    вредност = (8 + (C/4) - C + ((8*C + 13)/25) + 11 * (година%19))%30
    print "Епакт је: ",вредност

main()

Program iznad koristi koncept prethodnih lekcija kao i trenutne lekcije. Hajde da pogledamo program iznad u delovima.

Nakon definisanja funkcije pod nazivom "main" (glavna), kažemo joj šta želimo da "pokušamo" da imenujemo funkciju "epakt". Radi dok "while" nema "uspeha". Interpreter onda ide na liniju година = int(input("Која је година?\n")). Interpreter uzima vrednost unetu od strane korisnika i drži je u promenljivoj "godina".

Uneta vrednost nije ceo broj ili razlomak (koji bi bio pretvoren u ceo broj pomoću interpretatora), izuzetak će biti podignut, i izvršenje try bloka se završava, odmah pre успеха je dodeljena vrednost 1.

Hajde da pogledamo neke moguće izuzetke. Program iznad nema except izraz za svaki mogući izuzetak, jer postoje brojni tipovi izuzetaka.

Ako je vrednost uneta za godinu slovo, NameError izuzetak je podignut. U programu iznad, ovo je uhvaćeno od strane except NameError: linije, i prevodilac izvršava izjavu za štampanje ispod except NameError:, zatim postavlja vrednost "godina" na 0 iz predostrožnosti, čišćenje od svih ne numeričkoh brojeva. Prevodilac onda ide nazad do prve linije while petlje, i proces počinje ponovo.

Proces iznad bio bi isti za druge izuzetake koje imamo. Ako je podignut izuzetak, i postoji osim rečenice za to u našem programu, prevodilac će prikladno skočiti do izjave ispod osim rečenice, i izvršiti ih.

finally izjava, se ponekad koristi u izuzecima. Razmišljajte o tome kao adutu. Izjave ispod finally pešenice će biti izvršena bez obzira na to da li smo podigli izuzetak ili ne. finally izjava će biti izvršena nakon bilo kog try ili except rečenice pre njega.

Ispod je jednostavniji primer gde nemaju petlje, i finally klauzula se vrši bez obzira na izuzetke.

#Програм од стране Мишел Ајкенс 2012
#Нема ауторских права.

def main():
    try:
        број = int(input("Унесите цео број.\n"))
        половина = број/2
        print "Половина броја који сте унели је ",половина
    except NameError:
        print "Грешка."
    except ValueError:
        print "Грешка."
    except SyntaxError:
        print "Грешка."
    finally:
        print "Ја извршавам последну реченицу."
        
main()

Ako bismo uneli abecednu vrednost za број = int(input("Молимо вас, унесите број.\n")), izlaz bi bio sledeći:

Молимо вас, унесите број.
т
Грешка.
Ја извршавам последну реченицу.

Vešbe[uredi]

Ažurirajte barem program brojeva telefoni (u sekciji Fajl IO) tako da ne sruši ako korisnik ne unosi nikakve podatke na meniju.

Šablon:Vodič ua Pajton 2.6/Navigation