Питхон Покушајте осим: објашњено примерима

Питхон Три Екцепт је конструкција која се користи у Питхон-у за елегантно руковање изузецима без пада.

Руковање изузецима чини ваш програмски код поузданијим и мањом вероватноћом да ће отказати. Овај чланак води руковање изузецима и уобичајене сценарије у којима је руковање изузецима идеално. Као бонус, такође ћемо покрити како подићи изузетке.

Шта је руковање изузецима?

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

Ево примера који илуструје шта је изузетак.

user_input = input("Enter a number: ")
num = int(user_input)
print("Your number doubled is:", num * 2)

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

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

Али претпоставимо да сте поново покренули исти програм. Само овај пут, уместо да користите 5 као унос, унесите стринг „здраво“. Програм ће се срушити. Низ „здраво“ не може да се конвертује у цео број, тако да се ствара изузетак и програм се руши.

Зашто се појављују изузеци и зашто би требало да се позабавите њима?

Изузеци се јављају јер често разлажемо програме у функције када их кодирамо. Ове функције се затим позивају да обављају различите задатке.

У горњем примеру, позвали смо функцију инпут да примимо кориснички унос, затим смо позвали функцију инт да конвертујемо унос стринга у цео број, и на крају, позвали смо функцију принт да прикажемо неки излаз.

Међутим, док функције извршавају своје радње, могу наићи на грешке са којима не знају како да се изборе. У овом случају, наведене функције морају престати да раде и саопштавају да је дошло до грешке. Да би комуницирали, они ће подићи изузетке.

  Како да користите Гоогле Меет собе за сесију

Код који се зове функција је одговоран за слушање тих изузетака и одговарајуће реаговање. Ако се то не уради, програм ће се срушити након што наиђе на грешке, као што смо видели у претходном примеру.

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

Различите врсте изузетака

Важно је знати да нису сви изузеци исти. Постоје различите врсте изузетака за различите грешке на које се наилази. На пример, ако покушате да поделите број са нулом, појављује се грешка ЗероДивисионЕррор. А ТипеЕррор се јавља када покушате да извршите операцију са неважећим типом података. Ево комплетне листе врсте изузетака.

Како поступати са изузецима

Као што је раније објашњено, изузеци су сигнали узбуне које дају функције које позивамо. Наш кодекс би стога требало да слуша ове сигнале узбуне и да реагује на одговарајући начин када се огласи. Да бисмо правилно поступали са изузецима, користимо конструкције Питхон Три Екцепт. Основна структура конструкције је следећа:

try:
    # Code to try and run
except:
    # Code to run if an exception is raised
finally:
    # Code to run in the end, whether or not an exception is raised

Као што видите, конструкција се састоји од три кључне речи које су објашњене у наставку:

покушати

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

осим

Кључна реч осим означава блок кода који ће бити извршен ако се појави изузетак током извршавања блока три. Можете дефинисати више блокова осим за различите типове изузетака који се могу покренути. Ово ће бити илустровано касније.

коначно

Кључна реч финалли је трећа и последња кључна реч која се користи у Питхон-у Три Екцепт. Означава блок кода који ће бити извршен без обзира на то да ли се појави изузетак или не.

  СааС маркетинг објашњен за мање од 7 минута

Пример

Ево примера како горе наведене кључне речи могу да поднесу изузетак. Претходни пример ћемо модификовати на ово.

try:
    user_input = input("Enter a number: ")
    num = int(user_input)
    print("Your number doubled is:", num * 2)
except:
    print("Something went wrong")
finally:
    print("This code will be executed no matter what")

Ако покренете горњи код са 5, важећим уносом, као вашим уносом, добићете следеће:

А ако га покренете са „здраво“ као уносом, добићете следеће:

Дакле, када ниједан изузетак није покренут током извршавања кода у блоку три, рачунар је прешао на финалли блок. Међутим, када је дошло до изузетка током извршавања кода у блоку три, рачунар се преместио на блок осим, ​​а затим на блок финалли.

Такође можете да обрађујете изузетке за одређене врсте грешака. На пример, ако желите да обрађујете изузетке ВалуеЕррор и КеибоардИнтеррупт на специфичан начин, можете да измените горњи код на следећи начин:

try:
    user_input = input("Enter a number: ")
    num = int(user_input)
    print("Your number doubled is:", num * 2)
except ValueError:
    print("Value can't be converted to int")
except KeyboardInterrupt:
    print("Received a keyboard interrupt")
except:
    print("Catch-all exception block")
finally:
    print("This code will be executed no matter what")

У коду изнад, имамо 3 осим блока. Први блок осим хвата само изузетке ВалуеЕррор, док други само хвата изузетке КеибоардИнтеррупт. Последњи блок осим нема придружени тип изузетка за слушање. Као резултат, хвата преостале изузетке који нису ухваћени у прва два блока.

Покретањем кода изнад, требало би да добијете излаз сличан овоме:

Када се покрене изузетак, можете добити више информација о изузетку у објекту изузетка. Да бисте добили приступ објекту изузетка, користите кључну реч ас. Користи се на следећи начин:

try:
    user_input = input("Enter a number: ")
    num = int(user_input)
    print("Your number doubled is:", num * 2)
except ValueError as e:
    print("Value Error:", e)
except KeyboardInterrupt as e:
    print("Keyboard Interrupt:", e)
except Exception as e:
    print("Some other exception", e)

Како подићи изузетке

До сада смо се бавили изузецима које су изазвале друге функције. Међутим, такође је могуће да поднесете изузетке у свом коду. Да бисмо подигли изузетак, користимо кључну реч раисе. Такође наводимо класу која представља тип изузетка који желимо да покренемо и човеку читљиву поруку повезану са изузетком.

  Како направити пругасту табелу у програму Мицрософт Ворд

У следећем примеру користимо класу Екцептион да бисмо подигли генерички изузетак. Затим прослеђујемо поруку конструктору класе.

raise Exception('Something went wrong')

Ако покренете горњи исечак као програм, добићете излаз сличан овоме:

Такође можете навести различите врсте изузетака. На пример, можете подићи изузетак ТипеЕррор када вредност има погрешан тип података:

def double(x):
    if isinstance(x, int):
        return x * 2
    else
        raise TypeError('x should be an int')

Или ако је наведена вредност изван прихватљивих граница, можете подићи ВалуеЕррор:

def say_hello(name):
    if name == '':
        raise ValueError('Value outside bounds')
    else:
        print('Hello', name)

Такође можете креирати своје типове изузетака подкласирањем класе Екцептион. Ево примера:

class InvalidHTTPMethod(Exception):
    pass

У горњем примеру, креирали смо класу ИнвалидХТТПМетход, која наслеђује класу Екцептион. Можемо га користити на исти начин као и раније за подизање изузетака:

raise InvalidHTTPMethod('Must be GET or POST')

Уобичајени случајеви употребе за обраду изузетака

Руковање изузецима се користи у многим сценаријима. Претходни пример је показао како може да обрађује изузетке услед корисничког уноса. Овај одељак ће покрити две додатне ситуације у којима је руковање изузетцима корисно. Ово су руковање изузецима као резултат неуспелих мрежних захтева и руковање изузецима током читања датотека.

Израда мрежних захтева

У примеру испод, шаљемо захтев Гоогле-у. Слушамо изузетке да бисмо их решили. Ови изузеци су дефинисани у објекту рекуестс.екцептионс.

import requests

try:
    response = requests.get("https://google.com")

    # Check if the response status code is in the 200-299 range (successful response)
    if 200 <= response.status_code < 300:
        print("Request was successful!")
    else:
        print(f"Request failed with status code: {response.status_code}")
except requests.exceptions.RequestException as e:
    print(f"RequestException occurred: {e}")
except requests.exceptions.ConnectionError as e:
    print(f"ConnectionError occurred: {e}")
except requests.exceptions.Timeout as e:
    print(f"Timeout occurred: {e}")
except requests.exceptions.TooManyRedirects as e:
    print(f"TooManyRedirects occurred: {e}")
except requests.exceptions.HTTPError as e:
    print(f"HTTPError occurred: {e}")
except Exception as e:
    print(f"An unexpected error occurred: {e}")

Читање података из датотеке

У овом последњем примеру, читамо податке из хелло.ткт датотеке. Такође се бавимо уобичајеним изузецима који се могу појавити, као што су грешка ФилеНотФоунд и ИОЕррор.

try:
    with open(file_path, 'r') as file:
        data = file.read()
        print("File contents:")
        print(data)
except FileNotFoundError as e:
    print(f"FileNotFoundError occurred: {e}")
except IOError as e:
    print(f"IOError occurred: {e}")
except Exception as e:
    print(f"An unexpected error occurred: {e}")

Закључак

Овај чланак је истраживао који су изузеци и зашто су подигнути. Такође смо установили да њима рукујемо да бисмо учинили код поузданијим и спречили рушење. На крају, покрили смо како поступати са изузецима, као и како подићи неке изузетке.

Затим погледајте уобичајене типове грешака у Питхон-у и како да их решите.