Як перехопити кілька винятків у Python: простий посібник

Перехоплення винятків у Python допомагає рідше аварійно завершувати роботу ваших програм. Це робить ваш код більш надійним і забезпечує кращу взаємодію з користувачем. У цій статті я розповім, як перехопити кілька винятків в одному блоці try/except у Python.

Що таке винятки в Python?

в Python, Винятки — це механізм зв’язку між різними частинами програми. Цей механізм зв’язку дозволяє одній частині системи повідомити, що вона зіткнулася з критичною помилкою, яку вона не знає, як усунути.

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

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

Для цієї статті я припускаю, що ви вже знайомі з основами створення та обробки винятків, які описані в цій статті Вступ до Python Try/Except.

Важливість обробки кількох винятків у Python

  • Це зменшує дублювання коду, оскільки кілька винятків обробляються одним блоком. Це полегшує читання, редагування та видалення коду.
  • Це також допомагає вам писати більш ефективний код, оскільки тип помилки потрібно перевіряти лише один раз, а не кілька разів.

Обробка кількох винятків

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

  Як розширити сховище Xbox Series X|S

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

#1. Перехоплення різних винятків у різних блоках

Припустімо, що у нас є програма, призначена для отримання двох різних значень і їх розділення. Ми передбачаємо, що в цій програмі будуть створюватися різні типи винятків, коли користувач вводить недійсні значення. Зокрема, ми хочемо обробити помилки ValueError і ZeroDivisionError.

Помилка ValueError буде викликана, коли користувач введе значення, яке не можна перетворити на ціле число. Помилка ZeroDivisionError буде викликана, коли друге число дорівнює нулю. В обох цих випадках ми хочемо відобразити повідомлення про помилку: «Ви ввели недійсне значення».

Щоб зробити вищезазначене, ми можемо написати такий код:

try:
    dividend = int(input('Enter first num: '))
    divisor = int(input('Enter second num: '))
    quotient = dividend / divisor
    print(quotient)
except ValueError as e:
    print("You entered an invalid value")
except ZeroDivisionError as e:
    print("You entered an invalid value")
except Exception as e:
    print("Something went wrong")

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

І якщо ми введемо друге число як 0, це буде результат:

Код працює належним чином, але зауважте, що помилки ValueError і ZeroDivisionError обробляються однаково. Отже, існує багато дублювання коду між двома блоками винятків. Це не ідеально, оскільки ми порушуємо принцип DRY у програмуванні. Принцип DRY говорить «Не повторюйся».

  Що таке Slimware Utilities?

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

#2. Перехоплення кількох винятків в одному блоці винятків

Щоб перехопити кілька винятків, ми надаємо кортеж, який визначає всі помилки, які ми хочемо переловити. Ось приклад, коли ми виловлюємо помилки ValueError і ZeroDivisionError в одному блоці, крім:

try:
    dividend = int(input('Enter first num: '))
    divisor = int(input('Enter second num: '))
    quotient = dividend / divisor
    print(quotient)
except (ValueError, ZeroDivisionError) as e:
    print("You entered an invalid value")
except Exception as e:
    print("Something went wrong")

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

#3. Визначення того, який виняток було перехоплено

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

У цьому випадку ви повинні спочатку визначити, яку помилку було виявлено, і виконати відповідний код.

  Як налаштувати Gmail в Інтернеті

Щоб визначити, який виняток було перехоплено, ви можете використовувати блок if/else всередині блоку exception. Наприклад:

try:
    dividend = int(input('Enter first num: '))
    divisor = int(input('Enter second num: '))
    quotient = dividend / divisor
    print(quotient)
except (ValueError, ZeroDivisionError) as e:
    print("You entered an invalid value")

    if isinstance(e, ValueError):
        print('Value Error')
    else:
        print('Zero Division Error')
except Exception as e:
    print("Something went wrong")

У цьому блоці, окрім друку загального повідомлення про помилку як для ValueError, так і для ZeroDivisionError, ми також перевіряємо, який тип помилки ми виявили, і друкуємо додаткове повідомлення. Якщо ми знову перевіримо код, ми побачимо додаткові повідомлення, пов’язані з виявленим винятком.

Коли ви захочете обробляти кілька винятків?

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

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

Висновок

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