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__ переопределен, чтобы возвращать строку, содержащую сообщение об ошибке и дополнительную информацию.Преимущества такого подхода:
Важно: При выборе родительского класса исключения, от которого вы наследуетесь, убедитесь, что он семантически соответствует типу ошибки, которую вы хотите представить. Это делает ваш код более понятным и предсказуемым.