Exception
, ValueError
, TypeError
). В конструкторе __init__
можно добавить дополнительные атрибуты для хранения нужной информации. При возникновении исключения, нужно создать экземпляр нового класса и передать ему необходимые данные, а затем вызвать raise
. Пример:
class MyCustomError(ValueError):
def __init__(self, message, extra_info):
super().__init__(message)
self.extra_info = extra_info
try:
# ... код, который может вызвать исключение ...
raise MyCustomError("Неверное значение", {"деталь": "слишком большое"})
except MyCustomError as e:
print(f"Ошибка: {e}, Дополнительно: {e.extra_info}")
Для расширения стандартных исключений в Python и добавления дополнительной информации можно создать свой собственный класс исключения, который наследуется от одного из встроенных исключений (например, Exception
, ValueError
, TypeError
и т.д.) или от другого пользовательского исключения. При создании класса необходимо определить, какую именно дополнительную информацию вы хотите хранить.
Основные шаги:
__init__
): В конструкторе класса примите аргументы, представляющие дополнительную информацию, которую хотите хранить. Не забудьте вызвать конструктор родительского класса (super().__init__()
) для правильной инициализации. Сохраните переданную дополнительную информацию в атрибутах экземпляра класса.__str__
(опционально, но рекомендуется): Этот метод определяет, как исключение будет отображаться при печати или преобразовании в строку. Переопределение позволяет включить в строковое представление исключения дополнительную информацию.Пример:
class CustomValidationError(ValueError):
def __init__(self, message, field_name, invalid_value):
super().__init__(message) # Вызов конструктора родительского класса ValueError
self.field_name = field_name
self.invalid_value = invalid_value
self.message = message # Сохраняем сообщение для дальнейшего использования
def __str__(self):
return f"Validation error in field '{self.field_name}': {self.message}. Invalid value: {self.invalid_value}"
# Использование:
try:
value = "abc"
if not value.isdigit():
raise CustomValidationError("Value must be a number", "input_field", value)
except CustomValidationError as e:
print(e) # Output: Validation error in field 'input_field': Value must be a number. Invalid value: abc
print(f"Field name: {e.field_name}") # Output: Field name: input_field
print(f"Invalid value: {e.invalid_value}") # Output: Invalid value: abc
Пояснения к примеру:
CustomValidationError
наследуется от ValueError
.super().__init__(message)
вызывает конструктор ValueError
, передавая сообщение об ошибке.field_name
и invalid_value
хранят дополнительную информацию.__str__
переопределен, чтобы возвращать строку, содержащую сообщение об ошибке и дополнительную информацию.Преимущества такого подхода:
Важно: При выборе родительского класса исключения, от которого вы наследуетесь, убедитесь, что он семантически соответствует типу ошибки, которую вы хотите представить. Это делает ваш код более понятным и предсказуемым.