Python Try Except: пояснюється на прикладах

Python Try Except — це конструкція, яка використовується в Python для елегантної обробки винятків без збоїв.

Обробка особливих ситуацій робить ваш програмний код більш надійним і з меншою ймовірністю збою. У цій статті описано обробку винятків і типові сценарії, у яких обробка винятків є ідеальною. Як бонус, ми також розглянемо, як викликати винятки.

Що таке обробка винятків?

Винятком є ​​критичні аномалії та помилки, які виникають під час виконання програми. Якщо не обробити, винятки призведуть до збою програми. Тому обробка винятків — це спосіб обробки винятків, щоб гарантувати, що вони не приведуть до збою програми.

Ось приклад, щоб проілюструвати, що таке виняток.

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

На перший погляд здається, що в вищезгаданій програмі немає нічого поганого. Він отримує вхідні дані від користувача та перетворює їх на ціле число. Далі відображається подвоєне ціле число, надане користувачем.

Програма працює нормально, якщо ви запустите її з вхідним значенням 5. Дивіться нижче.

Але припустімо, що ви знову запустили ту саму програму. Тільки цього разу, замість використання 5 як введення, ви вводите рядок «hello». Програма вийде з ладу. Рядок «hello» не можна перетворити на ціле число, тому виникає виняток і програма аварійно завершує роботу.

Чому створюються винятки та чому ви повинні їх обробляти?

Винятки виникають, оскільки ми часто розкладаємо програми на функції під час їх кодування. Потім ці функції викликаються для виконання різних завдань.

У наведеному вище прикладі ми викликали функцію введення, щоб отримати дані, введені користувачем, потім викликали функцію int, щоб перетворити вхідний рядок у ціле число, і, нарешті, ми викликали функцію print, щоб відобразити вихідні дані.

Однак, коли функції виконують свої дії, вони можуть зіткнутися з помилками, які не знають, як усунути. У цьому випадку зазначені функції мають припинити роботу та повідомити, що сталася помилка. Щоб спілкуватися, вони створять винятки.

Код, який називається функцією, відповідає за прослуховування цих винятків і відповідну реакцію. Якщо цього не зробити, програма вийде з ладу після виявлення помилок, як ми бачили в попередньому прикладі.

  Як згенерувати підроблені тестові дані за допомогою Go

Таким чином, винятки, по суті, є механізмом зв’язку, який дозволяє викликаній функції надсилати сигнал лиха коду, який її викликав. І відповідна реакція, про яку згадувалося раніше, є суттю обробки винятків.

Різні види винятків

Важливо знати, що не всі винятки однакові. Існують різні типи винятків для різних виявлених помилок. Наприклад, якщо ви намагаєтеся поділити число на нуль, виникає помилка ZeroDivisionError. Помилка TypeError виникає, коли ви намагаєтеся виконати операцію з недійсним типом даних. Ось повний список типи винятків.

Як обробляти винятки

Як пояснювалося раніше, виняток становлять сигнали лиха, створені функціями, які ми викликаємо. Таким чином, наш код повинен прислухатися до цих сигналів лиха та відповідним чином реагувати, коли вони лунають. Для належної обробки винятків ми використовуємо конструкції Python Try Except. Основна структура конструкції така:

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

Як бачите, конструкція складається з трьох ключових слів, які пояснюються нижче:

спробувати

Ключове слово try позначає початок конструкції Python Try Except. Крім того, він позначає блок коду, який потенційно може викликати виключення. Це вказівка ​​інтерпретатору Python спробувати запустити код у блоці. Якщо виникає виняток, програма негайно зупиняється та переходить до виконання коду, написаного в блоці винятків.

крім

Ключове слово osim позначає блок коду, який буде виконано, якщо виникне виняток під час виконання блоку try. Ви можете визначити кілька блоків винятків для різних типів винятків, які можуть бути викликані. Це буде показано пізніше.

нарешті

Ключове слово finally є третім і останнім ключовим словом, яке використовується в Python Try Except. Він позначає блок коду, який буде виконано незалежно від того, чи буде створено виняток.

Приклад

Ось приклад того, як наведені вище ключові слова можуть обробляти винятки. Ми модифікуємо попередній приклад на це.

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, ви отримаєте наступне:

  Як зробити ліжко в майнкрафт

І якщо ви запустите його з «hello» як введенням, ви отримаєте наступне:

Отже, коли під час виконання коду в блоці try не було викликано жодного винятку, комп’ютер перейшов до блоку finally. Однак, коли під час виконання коду в блоці try було викликано виняток, комп’ютер перейшов до блоку exception, а потім до блоку finally.

Ви також можете обробляти винятки для певних видів помилок. Наприклад, якщо ви хочете обробляти винятки ValueError і KeyboardInterrupt у певний спосіб, ви можете змінити наведений вище код так:

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 блоки крім. Перший блок винятків перехоплює лише винятки ValueError, тоді як другий перехоплює лише винятки KeyboardInterrupt. Останній блок винятків не має пов’язаного типу винятку для прослуховування. У результаті він перехоплює решту винятків, не перехоплених першими двома блоками.

Запустивши наведений вище код, ви повинні отримати подібний результат:

Коли виникає виняток, ви можете отримати більше інформації про виняток в об’єкті виключення. Щоб отримати доступ до об’єкта винятку, ви використовуєте ключове слово as. Його використовують наступним чином:

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 у наступному прикладі, щоб викликати загальний виняток. Далі ми передаємо повідомлення конструктору класу.

raise Exception('Something went wrong')

Якщо ви запустите наведений вище фрагмент як програму, ви отримаєте результат, подібний до цього:

  InterServer робить запуск сайтів WordPress легшим, ніж будь-коли

Ви також можете вказати різні види винятків. Наприклад, ви можете викликати виняток TypeError, якщо значення має неправильний тип даних:

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

Або якщо вказане значення виходить за допустимі межі, ви можете викликати ValueError:

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

Ви також можете створити свої типи винятків, створивши підклас класу Exception. Ось приклад:

class InvalidHTTPMethod(Exception):
    pass

У прикладі вище ми створили клас InvalidHTTPMethod, який успадковує клас Exception. Ми можемо використовувати його так само, як і раніше, щоб створити винятки:

raise InvalidHTTPMethod('Must be GET or POST')

Загальні випадки використання для обробки винятків

Обробка винятків використовується в багатьох сценаріях. Попередній приклад показав, як він може обробляти винятки через введення користувача. У цьому розділі розглядатимуться дві додаткові ситуації, коли обробка винятків корисна. Це обробка винятків у результаті невдалих мережевих запитів і обробка винятків під час читання файлів.

Створення мережевих запитів

У прикладі нижче ми робимо запит до Google. Ми прислухаємося до винятків, щоб впоратися з ними. Ці винятки визначені в об’єкті requests.exceptions.

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}")

Читання даних з файлу

У цьому останньому прикладі ми читаємо дані з файлу hello.txt. Ми також обробляємо поширені винятки, які можуть виникати, як-от помилка FileNotFound і IOError.

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}")

Висновок

У цій статті досліджено, що таке винятки та чому вони були викликані. Ми також встановили, що обробляємо їх, щоб зробити код більш надійним і запобігти збоям. Нарешті, ми розглянули, як обробляти винятки, а також як викликати деякі винятки.

Далі ознайомтеся з поширеними типами помилок Python і способами їх вирішення.