Scope::setChildScopeExceptionHandler
(PHP 8.6+, True Async 1.0)
public function setChildScopeExceptionHandler(callable $exceptionHandler): void
Устанавливает обработчик исключений, возникающих в дочерних scope. Когда дочерний scope завершается с ошибкой, вызывается данный обработчик, предотвращая всплытие исключения в родительский scope.
Параметры
exceptionHandler — функция обработки исключений из дочерних scope. Принимает \Throwable как аргумент.
Возвращаемое значение
Функция не возвращает значения.
Примеры
Пример #1 Перехват ошибок дочерних scope
<?php
use Async\Scope;
$parentScope = new Scope();
$parentScope->setChildScopeExceptionHandler(function(\Throwable $e) {
error_log("Ошибка в дочернем scope: " . $e->getMessage());
});
$childScope = Scope::inherit($parentScope);
$childScope->spawn(function() {
throw new \RuntimeException("Ошибка в дочернем scope");
});
$childScope->awaitCompletion();
// Ошибка обработана, не всплывает в $parentScope
Пример #2 Изоляция ошибок между модулями
<?php
use Async\Scope;
$appScope = new Scope();
$appScope->setChildScopeExceptionHandler(function(\Throwable $e) {
error_log("[App] Ошибка модуля: " . $e->getMessage());
});
// Каждый модуль в своём scope
$authScope = Scope::inherit($appScope);
$cacheScope = Scope::inherit($appScope);
$authScope->spawn(function() {
// Ошибка здесь не затронет $cacheScope
throw new \RuntimeException("Auth failed");
});
$cacheScope->spawn(function() {
echo "Кеш работает нормально\n";
});
$appScope->awaitCompletion();
См. также
- Scope::setExceptionHandler — Обработчик ошибок корутин
- Scope::inherit — Создать дочерний scope
- Scope::getChildScopes — Получить дочерние scope