Как в собственном исключении определить дополнительную информацию об ошибке?

Определить дополнительную информацию в собственном исключении можно, добавив новые атрибуты в класс исключения. Пример:

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

try:
    # ... код, который может вызвать исключение ...
    raise MyCustomError("Произошла ошибка", 500)
except MyCustomError as e:
    print(f"Сообщение об ошибке: {e}")
    print(f"Код ошибки: {e.error_code}")
  
В этом примере error_code является дополнительной информацией об ошибке.

Чтобы определить дополнительную информацию об ошибке в пользовательском исключении в Python, нужно:
  1. Создать класс исключения, наследуясь от `Exception` или его подкласса (например, `ValueError`, `TypeError`).
  2. Определить метод `__init__` для инициализации исключения. В `__init__` принимаются аргументы, представляющие дополнительную информацию об ошибке. Важно вызывать конструктор родительского класса `Exception.__init__(self, message)` для установки сообщения об ошибке, где `message` - основное описание ошибки.
  3. Сохранить переданную дополнительную информацию в атрибутах объекта исключения. Эти атрибуты будут доступны при обработке исключения.
  4. Переопределить метод `__str__` (опционально). Этот метод определяет, как исключение будет отображаться при преобразовании в строку (например, при печати). Можно включить дополнительную информацию в возвращаемую строку.
Пример: class CustomError(Exception):
   def __init__(self, message, error_code, filename=None):
      super().__init__(message) # Вызываем конструктор родительского класса
      self.error_code = error_code
      self.filename = filename

   def __str__(self):
      base_message = super().__str__()
      additional_info = f" (Error Code: {self.error_code}"
      if self.filename:
         additional_info += f", Filename: {self.filename})"
      else:
         additional_info += ")"       return base_message + additional_info

try:
   raise CustomError("Something went wrong", 123, filename="data.txt")
except CustomError as e:
   print(e) # Выведет: Something went wrong (Error Code: 123, Filename: data.txt)
   print(f"Error code: {e.error_code}") # Выведет: Error code: 123
   if e.filename:
      print(f"Filename: {e.filename}") # Выведет: Filename: data.txt
Объяснение:
  • `CustomError` - это наш пользовательский класс исключения.
  • `__init__` принимает `message` (сообщение об ошибке), `error_code` (код ошибки) и `filename` (имя файла, вызвавшего ошибку).
  • `super().__init__(message)` вызывает конструктор базового класса `Exception`, чтобы установить сообщение об ошибке.
  • `self.error_code` и `self.filename` сохраняют дополнительную информацию в атрибутах объекта исключения.
  • `__str__` переопределен, чтобы включить код ошибки и имя файла в строковое представление исключения. Вначале вызывается `super().__str__()` чтобы получить базовое сообщение исключения.
  • В блоке `try...except` мы выбрасываем `CustomError` и перехватываем его. В блоке `except` мы можем получить доступ к дополнительной информации об ошибке через атрибуты `error_code` и `filename`.
Таким образом, вы можете передавать и обрабатывать любую релевантную информацию об ошибке в ваших пользовательских исключениях. Метод `__str__` позволяет удобно выводить эту информацию при отладке.
0