Водич за Пајтон 2.6/Суочавање са несавршеностима

...или како руковати грешкама

уреди

Дакле сада имате савршени програм, ради беспрекорно, осим једног детаља, програм ће срушити унос корисника који није добар. Не плашите се, за Пајтон имамо посебну контролну структуру за вас. Зове се покушај и покушава да уради нешто. Овде је пример програма са проблемом:

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

Приметите како када притиснете @#& враћа нешто као:

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

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

Као што можете да видите int() функција се не слаже са бројевима @#& (како би и требало да буде). Последња линија показује шта је проблем; Пајтон је пронашао ValueError. Како наш програм може да се носи са овим? Шта радимо је прво: стави на место где се одвија грешка у try блок, и друго: кажемо Пајтону како желимо да се носи са ValueErrors. Следећи програм ради ово:

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

Сада када покренемо нови програм и дате @#& говори нам "То није био број." наставља са оним што је радио раније.

Када ваш програм наставља да има неке грешке за које знате како да их решите, ставите код у try блок, и ставите начин да рукујете грешком except блоком.

Овде је сложенији пример Руковања грешкама.

# Програм од стране Мишел Ајкинс 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()

Програм изнад користи концепт претходних лекција као и тренутне лекције. Хајде да погледамо програм изнад у деловима.

Након дефинисања функције под називом "main" (главна), кажемо јој шта желимо да "покушамо" да именујемо функцију "епакт". Ради док "while" нема "успеха". Интерпретер онда иде на линију година = int(input("Која је година?\n")). Интерпретер узима вредност унету од стране корисника и држи је у променљивој "година".

Унета вредност није цео број или разломак (који би био претворен у цео број помоћу интерпретатора), изузетак ће бити подигнут, и извршење try блока се завршава, одмах пре успеха је додељена вредност 1.

Хајде да погледамо неке могуће изузетке. Програм изнад нема except израз за сваки могући изузетак, јер постоје бројни типови изузетака.

Ако је вредност унета за годину слово, NameError изузетак је подигнут. У програму изнад, ово је ухваћено од стране except NameError: линије, и преводилац извршава изјаву за штампање испод except NameError:, затим поставља вредност "година" на 0 из предострожности, чишћење од свих не нумеричкох бројева. Преводилац онда иде назад до прве линије while петље, и процес почиње поново.

Процес изнад био би исти за друге изузетаке које имамо. Ако је подигнут изузетак, и постоји осим реченице за то у нашем програму, преводилац ће прикладно скочити до изјаве испод осим реченице, и извршити их.

finally изјава, се понекад користи у изузецима. Размишљајте о томе као адуту. Изјаве испод finally пешенице ће бити извршена без обзира на то да ли смо подигли изузетак или не. finally изјава ће бити извршена након било ког try или except реченице пре њега.

Испод је једноставнији пример где немају петље, и finally клаузула се врши без обзира на изузетке.

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

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

Ако бисмо унели абецедну вредност за број = int(input("Молимо вас, унесите број.\n")), излаз би био следећи:

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

Вешбе

уреди

Ажурирајте барем програм бројева телефони (у секцији Фајл ИО) тако да не сруши ако корисник не уноси никакве податке на менију.

Шаблон:Водич уа Пајтон 2.6/Navigation