Рассмотрим эту простую функцию генератора в PHP.
function createAGenerator() {
echo 'Before First Yield',"\n";
yield 'First Yield';
echo 'Before Second Yield',"\n";
yield 'Second Yield';
echo 'Before Third Yield',"\n";
yield 'Third Yield';
}
Если я добавлю в этот генератор метод throw
объекта генератора
$generator = createAGenerator();
try {
$generator->throw(new Exception('Throwing into a Generator'));
} catch(Exception $e) {
echo 'Caught Exception: ', $e->getMessage(), "\n";
}
echo 'Resuming Main Program Execution',"\n";
, функция генератора перезапуститисключение для меня, чтобы поймать.Все это работает, как я ожидаю.
Однако - мой генератор теперь, кажется, навсегда застрял.Если я попытаюсь перейти к доходности next
или send
к новому значению, генератор, похоже, просто вернет NULL
.Например, следующая программа
<?php
function createAGenerator() {
echo 'Before First Yield',"\n";
yield 'First Yield';
echo 'Before Second Yield',"\n";
yield 'Second Yield';
echo 'Before Third Yield',"\n";
yield 'Third Yield';
}
$generator = createAGenerator();
try {
$generator->throw(new Exception('Throwing into a Generator'));
} catch(Exception $e) {
echo 'Caught Exception: ', $e->getMessage(), "\n";
}
echo 'Resuming Main Program Execution',"\n";
var_dump($generator->send('Some Value'));
var_dump($generator->current());
var_dump($generator->next());
var_dump($generator->current());
Возвращает следующий вывод.
Before First Yield
Caught Exception: Throwing into a Generator
Resuming Main Program Execution
NULL
NULL
NULL
NULL
Есть ли способ для генератора восстановить это?Или неперехваченное исключение в генераторе «ломает» этот текущий экземпляр генератора?