【发布时间】:2018-11-22 19:14:35
【问题描述】:
我有一个生成器,它将一组值传递给一个方法并产生结果。被调用的方法可能会返回异常。发生这种情况时,我希望异常通过调用生成器来处理异常的代码,然后继续循环生成器。
为了说明这一点,下面是一个生成器示例,它将产生 1,抛出 \Exception,然后产生 3。
/** @var \Generator $gen */
$gen = function () {
for ($i = 1; $i <= 3; $i++) {
if ($i == 2) {
throw new \Exception('Exception thrown for 2');
}
yield $i;
}
};
这是我尝试运行此代码的示例,以便我可以让它产生 3
$g = $gen();
var_export($g->current());
echo "\n";
try {
$g->next();
var_export($g->current());
echo "\n";
} catch (\Exception $e) {
echo $e->getMessage() . "\n";
}
try {
$g->next();
var_export($g->current());
echo "\n";
} catch (\Exception $e) {
echo $e->getMessage() . "\n";
}
以下是上述代码的输出。
1
Exception thrown for 2.
NULL
所以重复调用next() 什么都不做,current() 将返回NULL,我希望生成器继续通过异常,以便我可以得到 3。
【问题讨论】:
-
您可以尝试在您的条件下手动强制执行计数器增量。异常之前的 i++。