У овом упутству ћете научити како се рукује изузецима у вашем Питхон програму користећи три, осим и коначно изјаве уз помоћ примера.
Видео: Руковање изузецима Питхон-а (покушајте … осим … коначно)
Изузеци у Питхону
Питхон има много уграђених изузетака који се појављују када ваш програм наиђе на грешку (нешто у програму пође по злу).
Када се појаве ови изузеци, Питхон интерпретер зауставља тренутни процес и прослеђује га позивајућем процесу док се њиме не рукује. Ако се њиме не рукује, програм ће се срушити.
На пример, размотримо програм у којем имамо функцију A
која позива функцију B
, а она пак позива функцију C
. Ако се изузетак догоди у функцији, C
али се њиме не рукује C
, изузетак прелази на, B
а затим на A
.
Ако се никада не реши, приказује се порука о грешци и наш програм се изненада неочекивано зауставља.
Хватање изузетака у Питхону
У Питхону, са изузецима се може поступати помоћу try
израза.
Критична операција која може донети изузетак смештена је у try
клаузулу. Шифра која обрађује изузетке написана је у except
клаузули.
Тако можемо одабрати које ћемо операције извршити након што ухватимо изузетак. Ево једноставног примера.
# import module sys to get the type of exception import sys randomList = ('a', 0, 2) for entry in randomList: try: print("The entry is", entry) r = 1/int(entry) break except: print("Oops!", sys.exc_info()(0), "occurred.") print("Next entry.") print() print("The reciprocal of", entry, "is", r)
Оутпут
Унос је Упс! дошло. Следећи унос. Унос је 0 Упс! десио. Следећи унос. Унос је 2 Узајамност 2 је 0,5
У овом програму пролазимо кроз вредности листе рандомЛист. Као што је претходно поменуто, део који може изазвати изузетак смештен је унутар try
блока.
Ако се не догоди изузетак, except
блок се прескаче и наставља се нормалан проток (за последњу вредност). Али ако се деси неки изузетак, хвата га except
блок (прва и друга вредност).
Овде исписујемо име изузетка помоћу exc_info()
функције унутар sys
модула. Можемо видети да a
узроци ValueError
и 0
узроци ZeroDivisionError
.
Пошто се сваки изузетак у Питхону наслеђује из основне Exception
класе, горњи задатак такође можемо извршити на следећи начин:
# import module sys to get the type of exception import sys randomList = ('a', 0, 2) for entry in randomList: try: print("The entry is", entry) r = 1/int(entry) break except Exception as e: print("Oops!", e.__class__, "occurred.") print("Next entry.") print() print("The reciprocal of", entry, "is", r)
Овај програм има исти излаз као и горњи програм.
Хватање одређених изузетака у Питхону
У горњем примеру нисмо поменули ниједан специфичан изузетак у except
клаузули.
Ово није добра пракса програмирања, јер ће ухватити све изузетке и на сваки начин се носити са свим случајевима на исти начин. Можемо одредити које изузетке except
треба да ухвати клаузула.
try
Клаузула може имати било који број except
клаузула за руковање различите изузетке, међутим, вршиће се само једна у случају јавља изузетак.
Можемо користити скуп вредности да одредимо вишеструке изузетке у клаузули осим. Ево примера псеудо кода.
try: # do something pass except ValueError: # handle ValueError exception pass except (TypeError, ZeroDivisionError): # handle multiple exceptions # TypeError and ZeroDivisionError pass except: # handle all other exceptions pass
Повећавање изузетака у Питхону
У Питхон програмирању, изузеци се појављују када се грешке појаве током извођења. Такође можемо ручно да направимо изузетке помоћу raise
кључне речи.
Опционално можемо проследити вредности изузетку да бисмо разјаснили зашто је тај изузетак покренут.
>>> raise KeyboardInterrupt Traceback (most recent call last):… KeyboardInterrupt >>> raise MemoryError("This is an argument") Traceback (most recent call last):… MemoryError: This is an argument >>> try:… a = int(input("Enter a positive integer: "))… if a <= 0:… raise ValueError("That is not a positive number!")… except ValueError as ve:… print(ve)… Enter a positive integer: -2 That is not a positive number!
Питхон проба са елсе клаузулом
У неким ситуацијама можда ћете желети да покренете одређени блок кода ако се блок кода try
изводио без икаквих грешака. У тим случајевима можете да користите опционалну else
кључну реч са try
исказом.
Напомена : Претходним осим клаузула не обрађују се изузеци у клаузули елсе.
Погледајмо пример:
# program to print the reciprocal of even numbers try: num = int(input("Enter a number: ")) assert num % 2 == 0 except: print("Not an even number!") else: reciprocal = 1/num print(reciprocal)
Оутпут
Ако проследимо непаран број:
Унесите број: 1 Ни паран број!
Ако проследимо паран број, реципрочна вредност се израчунава и приказује.
Унесите број: 4 0,25
Међутим, ако пређемо 0, добијамо ZeroDivisionError
јер блок кода унутра else
не обрађује претходни except
.
Enter a number: 0 Traceback (most recent call last): File "", line 7, in reciprocal = 1/num ZeroDivisionError: division by zero
Python try… finally
The try
statement in Python can have an optional finally
clause. This clause is executed no matter what, and is generally used to release external resources.
For example, we may be connected to a remote data center through the network or working with a file or a Graphical User Interface (GUI).
In all these circumstances, we must clean up the resource before the program comes to a halt whether it successfully ran or not. These actions (closing a file, GUI or disconnecting from network) are performed in the finally
clause to guarantee the execution.
Here is an example of file operations to illustrate this.
try: f = open("test.txt",encoding = 'utf-8') # perform file operations finally: f.close()
Ова врста конструкције осигурава да је датотека затворена чак и ако се изузетак догоди током извршавања програма.