Sobes.tech
Назад к вопросам
Junior — Middle
57

Как реализовать собственный тип исключения в Python?

Ответ от нейросети

sobes.tech AI

Что хотят услышать интервьюеры:

Собственное исключение в Python обычно делают через наследование от Exception или одного из его подклассов. Это нужно, чтобы явно отличать доменные ошибки от встроенных и обрабатывать их отдельно. Часто в исключение добавляют полезные поля с контекстом ошибки и человекочитаемое сообщение.

Определение:

Собственный тип исключения — это пользовательский класс, который описывает специфическую ошибку в приложении. В Python такие классы обычно наследуют от Exception, чтобы их можно было поднимать через raise и перехватывать через except. Это помогает сделать обработку ошибок более понятной и точной.

Пример использования:

class InsufficientBalanceError(Exception):
    def __init__(self, balance, amount):
        self.balance = balance
        self.amount = amount
        super().__init__(f"Недостаточно средств: баланс {balance}, запрошено {amount}")

def withdraw(balance, amount):
    if amount > balance:
        raise InsufficientBalanceError(balance, amount)
    return balance - amount

try:
    new_balance = withdraw(100, 150)
except InsufficientBalanceError as e:
    print(e)
    print(f"Баланс: {e.balance}, сумма: {e.amount}")

Пояснение кода:

  1. InsufficientBalanceError наследуется от Exception, поэтому Python воспринимает его как нормальное пользовательское исключение.
  2. В __init__ сохраняются дополнительные данные: текущий баланс и запрашиваемая сумма.
  3. Через super().__init__(...) задаётся текст сообщения, который будет выводиться при печати исключения.
  4. В функции withdraw проверяется бизнес-условие: если денег не хватает, вызывается raise.
  5. В блоке try/except исключение перехватывается отдельно от остальных ошибок, после чего можно использовать и сообщение, и дополнительные поля объекта.

Ключевые моменты:

  • Наследоваться лучше от Exception, а не от BaseException.
  • Исключение имеет смысл делать для доменных или ожидаемых ошибок, которые нужно отдельно обрабатывать.
  • В пользовательский класс можно добавлять поля с контекстом ошибки.
  • Сообщение для Exception удобно передавать через super().__init__().
  • raise используется для генерации исключения, except — для его перехвата.
  • Отдельный тип исключения упрощает чтение кода и делает обработку ошибок точнее.