Вопрос проверяет умение создавать пользовательские исключения в Python, что необходимо для улучшения читаемости кода и точной обработки ошибок.
Кастомные исключения (user-defined exceptions) в Python — это классы, которые наследуются от встроенного класса Exception или его подклассов (например, ValueError, RuntimeError). Их основная цель — предоставить более семантически точные и информативные типы ошибок для конкретной предметной области вашего приложения, что улучшает читаемость кода и упрощает обработку исключений.
InsufficientFundsError вместо общего ValueError).try/except, не полагаясь на проверку строковых сообщений.Минимальная реализация — просто объявить класс, наследующийся от Exception. Обычно тело класса остаётся пустым, но вы можете переопределить метод __init__ для передачи дополнительной информации.
# Базовый пример
class MyCustomError(Exception):
"""Базовое кастомное исключение."""
pass
# Исключение с дополнительными атрибутами
class ValidationError(Exception):
def __init__(self, message, field_name):
super().__init__(message)
self.field_name = field_name
# Использование
def validate_age(age):
if age < 0:
raise ValidationError("Возраст не может быть отрицательным", "age")
if age > 150:
raise ValidationError("Возраст слишком велик", "age")
try:
validate_age(-5)
except ValidationError as e:
print(f"Ошибка в поле {e.field_name}: {e}")Кастомные исключения широко используются в веб-фреймворках (например, Django, FastAPI), библиотеках и бизнес-логике приложений. Они помогают отделить ошибки уровня приложения от системных ошибок Python.
# Пример в контексте банковского приложения
class InsufficientFundsError(Exception):
"""Исключение при недостатке средств на счете."""
def __init__(self, balance, amount):
self.balance = balance
self.amount = amount
message = f"Недостаточно средств. Баланс: {balance}, запрошено: {amount}"
super().__init__(message)
class BankAccount:
def __init__(self, balance):
self.balance = balance
def withdraw(self, amount):
if amount > self.balance:
raise InsufficientFundsError(self.balance, amount)
self.balance -= amount
return amount
# Клиентский код
account = BankAccount(100)
try:
account.withdraw(200)
except InsufficientFundsError as e:
print(e) # Выведет информативное сообщение
# Можно также получить доступ к e.balance и e.amountВывод: Кастомные исключения стоит применять, когда вам нужно чётко разделить типы ошибок в вашем приложении, добавить контекстную информацию к ошибке или создать иерархию исключений для сложной бизнес-логики. Они делают код более поддерживаемым и понятным для других разработчиков.