Перехоплення винятків у Python допомагає рідше аварійно завершувати роботу ваших програм. Це робить ваш код більш надійним і забезпечує кращу взаємодію з користувачем. У цій статті я розповім, як перехопити кілька винятків в одному блоці try/except у Python.
Що таке винятки в Python?
в Python, Винятки — це механізм зв’язку між різними частинами програми. Цей механізм зв’язку дозволяє одній частині системи повідомити, що вона зіткнулася з критичною помилкою, яку вона не знає, як усунути.
Отже, це породжує виняток. Інша частина програми, яка знає, як обробити помилку, перехопить виняток і правильно обробить помилку.
Якщо не обробляти, винятки призведуть до збою програми. Таким чином, обробка винятків запобігає збою вашої програми та робить її більш надійною.
Для цієї статті я припускаю, що ви вже знайомі з основами створення та обробки винятків, які описані в цій статті Вступ до Python Try/Except.
Важливість обробки кількох винятків у Python
- Це зменшує дублювання коду, оскільки кілька винятків обробляються одним блоком. Це полегшує читання, редагування та видалення коду.
- Це також допомагає вам писати більш ефективний код, оскільки тип помилки потрібно перевіряти лише один раз, а не кілька разів.
Обробка кількох винятків
Перехоплення кількох винятків стосується ситуації, коли кілька винятків перехоплюються за допомогою одного блоку винятків. У Python ви можете перехоплювати різні винятки в окремих блоках.
Крім того, якщо ви хочете обробити винятки подібним чином, ви можете обробити їх за допомогою одного блоку. Для цього вам потрібно буде перехопити кілька винятків. У цьому розділі я поясню, як це зробити на прикладі.
#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 говорить «Не повторюйся».
Отже, замість того, щоб писати код окремо, ми можемо об’єднати два блоки в один блок, який перехоплює кілька винятків. Якщо ми це зробимо, ми уникнемо повторення.
#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. У деяких випадках у вас може бути код, який ви хочете виконати для обох помилок, і інший код, який ви хочете виконати для однієї, але не для іншої помилки.
У цьому випадку ви повинні спочатку визначити, яку помилку було виявлено, і виконати відповідний код.
Щоб визначити, який виняток було перехоплено, ви можете використовувати блок 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 для початківців, які варто спробувати.