Как в собственном исключении использовать параметры конструктора для создания сообщения?

Пример:


 class MyCustomError(Exception):
  def __init__(self, message, code):
   self.message = message
   self.code = code

   super().__init__(f"Error: {self.message}, Code: {self.code}")

 try:
  raise MyCustomError("Invalid input", 400)
 except MyCustomError as e:
  print(e)  # Выведет: Error: Invalid input, Code: 400
 

Объяснение: В __init__ принимаются параметры (message, code). Вызываем super().__init__() и форматируем сообщение, используя параметры конструктора.


Для создания собственного исключения в Python с использованием параметров конструктора для формирования сообщения, необходимо:

  1. Создать класс исключения: Этот класс должен наследоваться от базового класса `Exception` (или от любого его подкласса, если требуется более специфическое поведение).
  2. Определить конструктор (`__init__`): В конструкторе принимаются параметры, которые будут использоваться для формирования сообщения об ошибке.
  3. Сформировать сообщение: В конструкторе формируется сообщение об ошибке, которое обычно сохраняется в атрибуте `self.message` или переопределяется метод `__str__`.
  4. Вызвать исключение: Исключение создается с нужными параметрами и выбрасывается с помощью оператора `raise`.

Пример кода:


class CustomError(Exception):
    def __init__(self, value, message="Произошла ошибка"):
        self.value = value
        self.message = f"{message}: value = {value}"  # Формируем сообщение

    def __str__(self):
        return self.message


def some_function(x):
    if x < 0:
        raise CustomError(x, "Недопустимое значение")
    return x * 2


try:
    result = some_function(-5)
    print(result)
except CustomError as e:
    print(f"Поймано исключение: {e}")

# Пример без передачи кастомного сообщения:
try:
    result = some_function(-1)
    print(result)
except CustomError as e:
    print(f"Поймано исключение: {e}")

Разъяснение:

  • Класс `CustomError` наследуется от `Exception`.
  • Конструктор `__init__` принимает `value` и опциональный параметр `message` (со значением по умолчанию).
  • Внутри конструктора формируется сообщение, которое содержит значение `value` и переданное (или дефолтное) сообщение. Используется f-строка для удобного форматирования.
  • Метод `__str__` переопределен для возврата сообщения при преобразовании объекта исключения к строке (например, при печати).
  • В функции `some_function` при некорректном значении `x` выбрасывается исключение `CustomError` с передачей значения `x` и кастомного сообщения.
  • В блоке `try...except` перехватывается исключение `CustomError` и выводится его сообщение с использованием метода `__str__`.

Альтернативный вариант (без атрибута `message`):


class CustomError(Exception):
    def __init__(self, value, message="Произошла ошибка"):
        self.value = value
        self.message_template = message

    def __str__(self):
        return f"{self.message_template}: value = {self.value}"


def some_function(x):
    if x < 0:
        raise CustomError(x, "Value cannot be negative")
    return x * 2

try:
    result = some_function(-5)
    print(result)
except CustomError as e:
    print(f"Error: {e}")

В этом варианте, мы сохраняем шаблон сообщения в `self.message_template` и формируем финальное сообщение в `__str__`.

Почему это важно:

  • Информативность: Передача параметров в исключение позволяет предоставить более конкретную информацию об ошибке.
  • Удобство отладки: Зная контекст ошибки (значение `value` в примере), отлаживать код становится проще.
  • Гибкость: Использование параметров и форматирования позволяет создавать более гибкие и информативные сообщения об ошибках.
0