2026-08-20 22:37:44 +03:00
# Иерархия исключений
2026-08-27 18:07:43 +03:00
XC_VM исключения фреймворка расширяют `XcVmException` — пустую базу **маркер**
(`class XcVmException extends \RuntimeException {}` , это не добавляет никаких дополнительных данных) — таким образом, вызывающие абоненты могут
охватите все семейство одним `catch (XcVmException)` или нацелитесь на определенную подсистему.
> **Масштаб.** Эта типизированная иерархия охватывает только **Контейнер DI** и **модульная система**.
> Это не вся панель целиком: конечные точки потоковой передачи/аутентификации сообщают о сбоях через
> `generateError()` (без исключений), и большая часть кода домена/CLI выдает простой
> исключения `\RuntimeException` или SPL — они по-прежнему совпадают с `catch (XcVmException)` только тогда, когда
> класс фактически расширяет его.
2026-08-20 22:37:44 +03:00
---
## Дерево
```
\Exception
2026-08-27 18:07:43 +03:00
└── \RuntimeException
└── XcVmException
├── Container
│ └── ContainerException (PSR-11 ContainerExceptionInterface)
│ ├── CircularDependencyException
│ ├── ServiceCreationException
│ └── NotFoundException (PSR-11 NotFoundExceptionInterface) *
└── Module
└── ModuleException
├── ModuleNotFoundException
├── ModuleLoadException
├── ModuleManifestException
└── ModuleCycleException
2026-08-20 22:37:44 +03:00
```
2026-08-27 18:07:43 +03:00
> \* `NotFoundException` расширяет `ContainerException` (таким образом, он принадлежит этому дереву), но он
> физически находится в `src/Core/Container/Psr/NotFoundException.php` под пространством имен
> `XcVm\Core\Container\Psr` — **нет** в `Core/Exception/Container/`.
2026-08-20 22:37:44 +03:00
---
## Исключения для контейнеров
|Класс|Когда его бросают|
| ----- | ----------- |
| `ContainerException` |База данных обо всех неисправностях контейнеров|
| `CircularDependencyException` |Заводской график службы содержит цикл|
| `ServiceCreationException` |Заводской вызов был произведен при создании сервиса|
2026-08-21 16:31:01 +03:00
| `NotFoundException` |`get($id)` запрос на незарегистрированную услугу|
2026-08-20 22:37:44 +03:00
`NotFoundException` реализует оба интерфейса PSR-11, поэтому контейнер совместим:
```php
try {
$service = $container -> get ( 'unknown' );
} catch ( NotFoundException $e ) {
// PSR-11 NotFoundExceptionInterface
}
```
---
## Исключения из модулей
|Класс|Когда его бросают|
| ----- | ----------- |
| `ModuleException` |База данных для всех отказов модулей|
| `ModuleNotFoundException` |Отсутствует необходимый модуль зависимостей|
| `ModuleLoadException` |Файл модуля не может быть загружен или класс не найден|
| `ModuleManifestException` |`module.json` отсутствует, неправильно сформирован или не прошел проверку|
2026-08-27 18:07:43 +03:00
| `ModuleCycleException` |Граф зависимостей имеет топологическую сортировку, генерируемую циклом `ModuleLoader` , с циклическим путем (`a -> b -> a` ) в сообщении. (В некоторых `@throws` блоках документации указано `\RuntimeException` ; это просто базовый тип — `ModuleCycleException` расширяет его с помощью `XcVmException` .)|
2026-08-20 22:37:44 +03:00
---
## Перехват по подсистемам
```php
// Catch any XC_VM exception
try {
$loader -> loadAll ();
} catch ( XcVmException $e ) {
logger () -> error ( $e -> getMessage ());
}
// Catch only module-related failures
try {
$loader -> loadAll ();
} catch ( ModuleException $e ) {
// ModuleNotFoundException | ModuleLoadException | ...
}
// Catch container-specific failures
try {
$container -> get ( 'missing' );
} catch ( ContainerException $e ) {
// CircularDependencyException | NotFoundException | ...
}
```
---
2026-08-27 18:07:43 +03:00
## Добавление или выбор исключения
- **Который нужно выбросить:** используйте наиболее конкретный существующий тип (например, `ModuleManifestException`
для неудачного `module.json` ). Если ничего не подходит и это сбой на уровне фреймворка, выбросьте
`XcVmException` (или новый подкласс), чтобы его можно было отслеживать как одно семейство. Домен/бизнес
ошибки, не связанные с работой фреймворка, могут привести к появлению простого сообщения `\RuntimeException` /
`\InvalidArgumentException` .
- **Добавление категории:** создайте класс в соответствии с `src/Core/Exception/<Subsystem>/` , расширьте
база подсистемы (`ContainerException` / `ModuleException` ) — или `XcVmException` для нового
подсистема — и добавьте ее в дерево выше. Регистрация не требуется, все просто PHP.
---
2026-08-20 22:37:44 +03:00
## Местоположение
```
src/Core/Exception/
├── XcVmException.php
├── Container/
│ ├── ContainerException.php
│ ├── CircularDependencyException.php
2026-08-27 18:07:43 +03:00
│ └── ServiceCreationException.php
2026-08-20 22:37:44 +03:00
└── Module/
├── ModuleException.php
├── ModuleNotFoundException.php
├── ModuleLoadException.php
├── ModuleManifestException.php
└── ModuleCycleException.php
```
## Связанные файлы
|Файл|Роль|
| --- | --- |
| `src/Core/Exception/` |Базовые классы исключений и иерархия проекта|