Ключове слово raise в Python використовується для явного генерування винятків. Винятки (exceptions) - це події, які відбуваються під час виконання програми і порушують її звичайний хід. raise дозволяє тобі сигналізувати про те, що сталася якась нештатна ситуація.
Основний синтаксис raise виглядає так:
raise Виняток
або
raise Виняток("Повідомлення про помилку")
Де:
* Виняток - це клас винятку, який ти хочеш згенерувати (наприклад, ValueError, TypeError, FileNotFoundError, або власний користувацький клас винятку).
* "Повідомлення про помилку" (необов'язково) - це рядок, який надає додаткову інформацію про причину виникнення винятку.
Коли використовується raise?
* Перевірка вхідних даних: Ти можеш використовувати raise для перевірки аргументів функції та генерувати виняток, якщо вони не відповідають очікуванням. Як у прикладі:
def обробити_позитивне_число(число):
if число < 0:
raise ValueError("Вхідне значення не може бути від'ємним.")
print(f"Обробляється: {число}")
* Сигналізація про помилки в логіці програми: Якщо в процесі виконання програми виникає непередбачувана ситуація, про яку ти хочеш повідомити, ти можеш згенерувати відповідний виняток.
def отримати_дані(джерело):
if джерело не є дійсним:
raise RuntimeError(f"Не вдалося отримати дані з джерела: {джерело}")
# ... логіка отримання даних ...
* Передача винятків далі: У блоках except ти можеш знову використати raise (без вказання конкретного винятку), щоб передати поточний виняток на вищий рівень обробки. Це корисно, коли ти хочеш виконати якісь дії при виникненні винятку, але не повністю його обробляти.
try:
# ... код, що може викликати помилку ...
except FileNotFoundError:
print("Файл не знайдено. Спроба відновити...")
# ... спроба відновлення ...
if не вдалося відновити:
raise # Передача винятку FileNotFoundError далі
* Створення власних винятків: Ти можеш визначати власні класи винятків, успадковуючись від базового класу Exception або його підкласів. Це дозволяє тобі створювати винятки, які найкраще відображають специфічні помилки у твоєму коді.
class НедостатньоКоштів(Exception):
def __init__(self, баланс, потрібно):
self.баланс = баланс
self.потрібно = потрібно
super().__init__(f"Недостатньо коштів на рахунку. Баланс: {баланс}, потрібно: {потрібно}")
def зняти_кошти(рахунок, сума):
if рахунок.баланс < сума:
raise НедостатньоКоштів(рахунок.баланс, сума)
рахунок.баланс -= сума
print("Кошти знято.")
Переваги використання raise:
* Чітке повідомлення про помилки: Дозволяє явно вказувати, коли і чому виникла помилка.
* Структурована обробка помилок: У поєднанні з блоками try...except забезпечує гнучкий механізм обробки виняткових ситуацій.
* Покращення читабельності коду: Відокремлює логіку обробки помилок від основного коду.
* Полегшення налагодження: Допомагає легше ідентифікувати та виправляти помилки.
Сподіваюся, це пояснення було корисним!
Ось ще один приклад:
def обробити_позитивне_число(число):
if число < 0:
raise ValueError("Вхідне значення не може бути від'ємним.")
# ... обробка позитивного числа ...
print(f"Обробляється: {число}")
try:
обробити_позитивне_число(5)
обробити_позитивне_число(-2)
except ValueError as e:
print(f"Виникла помилка: {e}")
Обробляється: 5
Виникла помилка: Вхідне значення не може бути від'ємним.
Пояснення:
* Функція обробити_позитивне_число приймає один аргумент число.
* Всередині функції відбувається перевірка: якщо число менше за 0, то генерується виняток ValueError з відповідним повідомленням.
* Далі в блоці try викликаються функція обробити_позитивне_число двічі: спочатку з позитивним числом (5), а потім з від'ємним (-2).
* Перший виклик функції з числом 5 проходить успішно, оскільки умова число < 0 є хибною, і виконується рядок print(f"Обробляється: {число}"), що виводить "Обробляється: 5".
* Другий виклик функції з числом -2 призводить до того, що умова число < 0 стає істинною, і генерується виняток ValueError.
* Блок except ValueError as e: перехоплює цей виняток. Змінній e присвоюється об'єкт винятку.
* Виконується рядок print(f"Виникла помилка: {e}"), який виводить повідомлення про помилку, що міститься у винятку e, а саме "Виникла помилка: Вхідне значення не може бути від'ємним.".
Коментарі
Дописати коментар