class MyCustomError(Exception):
  def __init__(self, message, function_name=None, line_number=None):
   super().__init__(message)
   self.function_name = function_name
   self.line_number = line_number
  def __str__(self):
   return f"{super().__str__()} (Function: {self.function_name}, Line: {self.line_number})"
 try:
  # Code that might raise an error
  raise MyCustomError("Something went wrong", function_name="my_function", line_number=42)
 except MyCustomError as e:
  print(e) # Output includes the message, function name, and line number
  Для передачи параметров, таких как имя функции или номер строки, в собственные исключения в Python, можно использовать несколько подходов. Самый распространенный и рекомендуемый - это передавать их как аргументы конструктора класса исключения (__init__).
Пример реализации:
class MyCustomError(Exception):
    def __init__(self, message, function_name=None, line_number=None):
        super().__init__(message)  # Вызов конструктора базового класса Exception
        self.function_name = function_name
        self.line_number = line_number
        self.message = message  # Сохраняем сообщение об ошибке
    def __str__(self):
        error_message = self.message
        if self.function_name:
            error_message += f" in function: {self.function_name}"
        if self.line_number:
            error_message += f" at line: {self.line_number}"
        return error_message
Объяснение:
MyCustomError, наследуясь от базового класса Exception.__init__ принимает сообщение об ошибке (message), а также опциональные параметры function_name и line_number.Exception с сообщением об ошибке (super().__init__(message)).  Это важно для правильной работы механизма исключений.function_name и line_number в атрибуты объекта исключения.__str__ переопределен, чтобы предоставить удобное строковое представление исключения, включая информацию о функции и номере строки, если они доступны.Пример использования:
import inspect
import traceback
def my_function(x):
    try:
        if x < 0:
            frame = inspect.currentframe()
            raise MyCustomError("Value cannot be negative",
                                function_name=my_function.__name__,
                                line_number=frame.f_lineno)
        return x * 2
    except MyCustomError as e:
        print(e)
        # Дополнительная обработка исключения, например, логирование
        traceback.print_exc()
my_function(-5) # Вызовет MyCustomError
my_function(5)
Дополнительные замечания:
inspect.currentframe() позволяет получить информацию о текущем фрейме стека вызовов, включая номер строки.traceback.print_exc() полезно для отладки, так как выводит полную трассировку стека, показывая путь выполнения программы до момента возникновения исключения.__name__ у функции возвращает ее имя в виде строки.inspect.currentframe().f_lineno можно также использовать sys._getframe().f_lineno.  Однако, sys._getframe() считается деталью реализации CPython и не рекомендуется к использованию в production коде, так как его поведение может измениться в будущих версиях.  inspect - более надежный вариант.Этот подход позволяет не только передавать произвольные параметры в исключение, но и предоставляет гибкий способ форматирования сообщения об ошибке и извлечения полезной информации для отладки.