0Pricing
Python Academy · Урок

Пользовательские классы исключений

Определяйте собственные типы исключений для более понятного сообщения об ошибках.

«Пользовательские классы исключений» — бесплатный урок Python Academy на CoddyKit. Это урок 4 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Python Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Python Academy содержит 4 уроков всего.

Введение

Пользовательские классы исключений делают обработку ошибок явной, понятной без дополнительной документации и удобной для точного перехвата вызывающим кодом.

Зачем нужны пользовательские исключения

Встроенные исключения слишком общие. Пользовательские исключения позволяют вызывающему коду перехватывать только ошибки Вашей библиотеки, не затрагивая несвязанные ошибки.
class AppError(Exception):
    pass
raise AppError('something went wrong')

Наследование от Exception

class MyError(Exception): pass — это всё, что Вам нужно. Всегда наследуйтесь от Exception, а не от BaseException.
class ValidationError(Exception):
    pass
try:
    raise ValidationError('email is invalid')
except ValidationError as e:
    print(e)

Добавление пользовательских атрибутов

class APIError(Exception): def __init__(self, status, message): self.status = status; super().__init__(message)
class APIError(Exception):
    def __init__(self, status, message):
        self.status = status
        super().__init__(message)
try:
    raise APIError(404, 'Not found')
except APIError as e:
    print(e.status, e)

Иерархия исключений

Создайте иерархию: class DBError(AppError): pass — вызывающий код может перехватывать AppError для любой ошибки приложения или отдельно DBError.
class AppError(Exception): pass
class DBError(AppError): pass
class NetworkError(AppError): pass
try:
    raise DBError('timeout')
except AppError as e:
    print('app error:', e)

Пользовательский метод __str__

Переопределите __str__, чтобы управлять видом сообщения исключения при его выводе.
class RangeError(ValueError):
    def __init__(self, val, lo, hi):
        self.val, self.lo, self.hi = val, lo, hi
    def __str__(self):
        return f'{self.val} not in [{self.lo}, {self.hi}]'
print(RangeError(15, 0, 10))

Возбуждение пользовательских исключений

Используйте raise в своих функциях, чтобы сигнализировать об ошибках, связанных с предметной областью. Это создаёт понятный API для вызывающего кода.
class InsufficientFundsError(Exception):
    def __init__(self, needed, available):
        super().__init__(f'Need {needed}, have {available}')
def withdraw(balance, amount):
    if amount > balance:
        raise InsufficientFundsError(amount, balance)
    return balance - amount
try:
    withdraw(100, 200)
except InsufficientFundsError as e:
    print(e)

Перехват по базовому классу

except AppError перехватывает все производные классы: DBError, NetworkError и другие. Иерархия позволяет вызывающему коду выбирать нужную степень конкретности.
class AppError(Exception): pass
class DBError(AppError): pass
try:
    raise DBError('conn failed')
except AppError:
    print('any app error')

Исключение с контекстным менеджером

Пользовательские исключения интегрируются с контекстными менеджерами: class suppressed: __exit__ возвращает True, чтобы подавить исключение.
class SuppressValue(Exception): pass
try:
    raise SuppressValue('ignored')
except SuppressValue:
    pass  # suppress silently
print('continued')

Документирование пользовательских исключений

Документируйте, WHEN возбуждать исключение и WHAT означают его атрибуты. Хорошие строки документации делают пользовательские исключения удобными в использовании.
class ConfigError(Exception):
    """Raised when configuration is invalid.
    Attributes:
        key: The invalid config key
    """
    def __init__(self, key, msg):
        super().__init__(msg)
        self.key = key

Рекомендации

Делайте иерархию неглубокой (2–3 уровня). Всегда наследуйтесь от Exception. Используйте понятные имена, оканчивающиеся на Error. Размещайте исключения в отдельном модуле exceptions.py.
# Good structure:
class AppError(Exception): pass
class ValidationError(AppError): pass
class NotFoundError(AppError): pass
print('hierarchy demo')

Быстрая проверка

От какого класса должны наследоваться пользовательские исключения, чтобы не перехватывать события завершения системы?

Итоги

Пользовательские исключения: наследуйтесь от Exception, добавляйте атрибуты в __init__, переопределяйте __str__. Создавайте иерархии для удобного перехвата. Размещайте исключения в модуле exceptions.py.

Продолжайте обучение

Отличная работа! Перейдите к следующему уроку, чтобы продолжить обучение.

Часто задаваемые вопросы

Урок «Пользовательские классы исключений» бесплатный?

Да — полный текст урока «Пользовательские классы исключений» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Python Academy, подпишись на CoddyKit PRO. Курс Python Academy содержит 4 уроков всего.

Чему я научусь в уроке «Пользовательские классы исключений»?

Определяйте собственные типы исключений для более понятного сообщения об ошибках. Ты практикуешь Python Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать Python Academy?

Предыдущий опыт не требуется. Python Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 4 из 4.

Сколько времени занимает урок «Пользовательские классы исключений»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке Python Academy?

Да. Каждый урок Python Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. Разбор исключений
  2. try / except / else / finally
  3. Вызов и повторный вызов исключений
  4. Пользовательские классы исключений
← Назад к Python Academy