Назад к вопросам
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}")
Пояснение кода:
InsufficientBalanceErrorнаследуется отException, поэтому Python воспринимает его как нормальное пользовательское исключение.- В
__init__сохраняются дополнительные данные: текущий баланс и запрашиваемая сумма. - Через
super().__init__(...)задаётся текст сообщения, который будет выводиться при печати исключения. - В функции
withdrawпроверяется бизнес-условие: если денег не хватает, вызываетсяraise. - В блоке
try/exceptисключение перехватывается отдельно от остальных ошибок, после чего можно использовать и сообщение, и дополнительные поля объекта.
Ключевые моменты:
- Наследоваться лучше от
Exception, а не отBaseException. - Исключение имеет смысл делать для доменных или ожидаемых ошибок, которые нужно отдельно обрабатывать.
- В пользовательский класс можно добавлять поля с контекстом ошибки.
- Сообщение для
Exceptionудобно передавать черезsuper().__init__(). raiseиспользуется для генерации исключения,except— для его перехвата.- Отдельный тип исключения упрощает чтение кода и делает обработку ошибок точнее.