Событие init_failure
Событие init_failure из секции event
срабатывает, когда в процессе создания экземпляра
(инициализации) возникает исключение. Обработчик
события получает целевой объект, аргументы и
словарь контекста, а также информацию об ошибке.
Это позволяет логировать сбои, выполнять
дополнительные проверки или изменять поведение
приложения без изменения исходного кода класса.
Синтаксис
from sqlalchemy import event
@event.listens_for(TargetClass, 'init_failure')
def handler(target, args, kwargs):
# logic here
pass
Пример
Рассмотрим простой класс, который при инициализации
проверяет переданное значение и выбрасывает
исключение, если оно некорректно. Подключим
обработчик события init_failure для
логирования ошибки:
from sqlalchemy import event
class Article:
def __init__(self, title):
if not title:
raise ValueError('Title cannot be empty')
self.title = title
@event.listens_for(Article, 'init_failure')
def on_init_failure(target, args, kwargs):
print(f'Init failed for {target.__class__.__name__} with args={args}')
try:
Article('')
except ValueError:
pass
Результат выполнения кода:
"Init failed for Article with args=('',)"
Пример
Событие можно использовать совместно с ORM-моделями.
Создадим модель Article с полем title,
инициализация которого может завершиться ошибкой.
Обработчик зафиксирует информацию об исключении:
from sqlalchemy import event
from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column
class Base(DeclarativeBase):
pass
class Article(Base):
__tablename__ = 'articles'
id: Mapped[int] = mapped_column(primary_key=True)
title: Mapped[str]
def __init__(self, title):
if len(title) < 3:
raise ValueError('Title too short')
self.title = title
@event.listens_for(Article, 'init_failure')
def log_failure(target, args, kwargs):
print(f'Failed to init Article with args={args}')
try:
Article('ab')
except ValueError:
pass
Результат выполнения кода:
"Failed to init Article with args=('ab',)"
Смотрите также
-
событие
init,
которое срабатывает при успешной инициализации объекта -
событие
before_configured,
которое вызывается перед настройкой мапперов -
событие
after_configured,
которое вызывается после настройки мапперов -
функцию
listens_for,
которая регистрирует обработчик события