Перейти к содержанию

Исключения

Все исключения archtool наследуются от ArchToolError.

from archtool.exceptions import (
    ArchToolError,
    CircularDependencyError,
    DependencyDuplicate,
    DependencyDoesNotRegistred,
    InstantiationError,
    TopLevelLayerUsingException,
    MultipleRealizationsException,
    RealizationNotFound,
    ModuleValidationError,
    AnnotationsNotResolvableError,
)

Справочник

ArchToolError

Базовый класс для всех исключений archtool.


DependencyDuplicate

Выбрасывается при вызове register() с другим экземпляром для уже зарегистрированного ключа.

injector.register(key=UserRepoABC, value=repo_a)
injector.register(key=UserRepoABC, value=repo_b)  # выбросит DependencyDuplicate

Не выбрасывается, если один и тот же экземпляр регистрируется дважды — этот вызов молча игнорируется.


DependencyDoesNotRegistred

Выбрасывается в get_dependency() и во время второго прохода инъекции, когда обязательная зависимость не имеет зарегистрированной реализации.

Сообщение об исключении включает список всех текущих ключей реестра для диагностики:

DependencyDoesNotRegistred: Dependency 'myproject.app.orders.interfaces.OrderRepoABC'
is not registered in the DI container.

Registered dependencies:
  • myproject.app.users.interfaces.UserRepoABC
  • myproject.app.users.interfaces.UserServiceABC

Частые причины: - Модуль, владеющий интерфейсом, не указан в modules_list - Конкретный класс реализации отсутствует в ожидаемом файле слоя - Интерфейс не наследует нужный маркер слоя (ABCRepo, ABCService и т.д.)


TopLevelLayerUsingException

Выбрасывается, когда класс в нижнем слое напрямую импортирует из верхнего, нарушая границы Clean Architecture.

Ловится при старте во время inject(), а не в рантайме.


MultipleRealizationsException

Выбрасывается, когда более одного конкретного класса реализует один и тот же интерфейс в одном модуле.

archtool принудительно требует одну реализацию на интерфейс на модуль. Для условной разводки (prod vs. заглушка) используйте register() до inject().


RealizationNotFound

Выбрасывается, когда интерфейс объявлен в interfaces.py, но в ожидаемом файле слоя не найдена конкретная реализация.


ModuleValidationError

Выбрасывается командой CLI archtool validate, когда AppModule не проходит структурные проверки (например, отсутствует interfaces.py).


CircularDependencyError

Публичный класс исключения для использования в кастомном инструментарии или расширениях фреймворка. archtool не выбрасывает его автоматически во время inject() — циклы допустимы и вместо исключения производят лог WARNING (см. FAQ).

from archtool.exceptions import CircularDependencyError

raise CircularDependencyError(["key.A", "key.B", "key.A"])

InstantiationError

Выбрасывается, когда archtool не может вызвать impl_class() без аргументов в проходе 1.

archtool всегда инстанциирует конкретные классы как Class(). Если конструктор требует позиционные аргументы — вызов упадёт с TypeError, который перебрасывается как InstantiationError с понятным сообщением:

InstantiationError: Cannot instantiate 'UserRepo': __init__() missing 1
required positional argument: 'db_url'

archtool requires a no-argument __init__. Use injector.register(InterfaceABC,
your_instance) before inject() to provide instances that need constructor arguments.

Решение: предварительно зарегистрировать экземпляр через register() до вызова inject().


AnnotationsNotResolvableError

Выбрасывается, когда аннотации класса не удаётся разрешить — чаще всего при использовании from __future__ import annotations с forward-ссылкой, которой не существует во время сборки DI.