Python надає можливість викликати (піднімати) винятки явно, за допомогою оператора raise. Таким чином можна вказати, що сталася певна помилка, та контролювати потік виконання вашої програми шляхом відповідної обробки цих винятків. Це може бути корисним для вирішення ситуацій, коли нормальний потік програми не може продовжуватись через помилку або неочікуваний стан.

У Python можна викликати як вбудовані винятки (ValueError, TypeError, тощо), щоб вказати типові умови виникнення помилки, так і власні винятки, специфічні саме для вашої програми.

Підняття вбудованих винятків

Для підняття будь-якого вбудованого винятку Python, потрібно використати оператор raise, створивши екземпляр класу винятку. Базовий синтаксис:

raise ExceptionType('error message')

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

import math


def square_root(x):
    if x < 0:
        raise ValueError('Argument cannot be negative')
    return math.sqrt(x)


# Example usage
try:
    result = square_root(-9)
except ValueError as e:
    print('Error:', e)

# Error: Argument cannot be negative

Підняття користувацьких винятків

При наявності класу з користувацьким винятком, виклик власних винятків не відрізняється від вбудованих. Приклад:

class InvalidAgeError(Exception):
    pass


def register_user(age):
    if age < 18:
        raise InvalidAgeError('User must be at least 18 years old')
    print('User registered successfully')


try:
    register_user(16)
except InvalidAgeError as e:
    print('Registration failed:', e)

# Registration failed: User must be at least 18 years old

Докладніше про створення власних винятків у Python.

Повторне підняття винятків (Re-Raising Exceptions)

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

Щоб повторно підняти виняток у Python, слід скористатись інструкцією raise без вказівки винятку, яка повторно підніме останній активний у поточній області видимості виняток. Приклад:

def read_file(file_path):
    try:
        with open(file_path, 'r') as file:
            return file.read()
    except FileNotFoundError:
        print(f'File \'{file_path}\' not found.')
        raise  # Re-raise the last active exception


def process_data(file_path):
    try:
        data = read_file(file_path)
        print('File read successfully.')
    except Exception as e:
        print('Failed to process data:', e)


process_data('non_existent_file.txt')

# File 'non_existent_file.txt' not found.
# Failed to process data: [Errno 2] No such file or directory: 'non_existent_file.txt'

У цьому прикладі:

  • функція read_file() намагається відкрити та прочитати файл
  • якщо файл не знайдено, вона виводить повідомлення про помилку, та повторно піднімає виняток FileNotFoundError
  • далі виняток буде перехоплений та оброблений на наступному рівні стеку викликів

Мітки: