Почему в PHP с помощью Generator :: throw пропускает полученные значения после throw

Я пытаюсь понять почему Генератор :: бросок заставляет вызывающего абонента не получать значения после перехвата Exception в Generator,

<?php

class moo
{
public function run()
{
$generator = $this->getIterator();
foreach ($generator as $item) {
try {
error_log("PROCESS: {$item}");

if ($item % 2 === 0) {
error_log("throwing InvalidArgumentException $item");
throw new InvalidArgumentException($item);
}
} catch (Throwable $e) {
$generator->throw($e);
}
}
}

private function getIterator()
{
foreach (range(1, 6) as $item) {
try {
yield $item;

} catch (Throwable $e) {

$class = get_class($e);
error_log("GOT[$class] in generator: {$e->getMessage()}");
}
}
}
}

$m = new moo();
$m->run();

вышеприведенный код печатает:

PROCESS: 1
PROCESS: 2
throwing InvalidArgumentException 2
GOT[InvalidArgumentException] in generator: 2
PROCESS: 4
throwing InvalidArgumentException 4
GOT[InvalidArgumentException] in generator: 4
PROCESS: 6
throwing InvalidArgumentException 6
GOT[InvalidArgumentException] in generator: 6

поэтому такие значения, как 3 и 5 не видны в цикле run метод

В документации не указано, что это ожидаемое поведение

Выдает исключение в генератор и возобновляет выполнение
генератор. Поведение будет таким же, как если бы текущая доходность
выражение было заменено оператором throw $ исключения.

это ошибка в php?

2

Решение

Как вы цитируете документы PHP:

…Поведение будет таким же, как если бы текущий выражение выражения
был заменен броском
$ исключение.

Это ожидаемое поведение.

2

Другие решения

Как Пол Кровелла а также Лукаш Якубек объяснил, значение теряется в возвращаемое значение $generator->throw(),

Я создал проект, если Генератор упакован, yield Значения появляются последовательно с потребителем доходности: https://github.com/glensc/ThrowableGenerator

РЕДАКТИРОВАТЬ: добавлено: send () также: https://github.com/glensc/ThrowableGenerator/releases/tag/1.1.0

1

По вопросам рекламы [email protected]