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