【发布时间】:2019-04-15 14:55:23
【问题描述】:
考虑一下 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
有没有办法让生成器从中恢复?还是生成器中未捕获的异常“破坏”了当前的生成器实例?
【问题讨论】:
-
你想用这个实现什么 - 向生成器发出信号或只是看看它为什么会中断?
-
@NigelRen 感谢您的回复。对于这个问题,我没有任何特别的目标。相反,我试图更好地理解所有可能情况下的生成器代码执行情况。
-
只是您使用
->send(),但不要获取该值,使用$ret = yield 'First Yield';将允许您针对某些特定情况向生成器发出“信号”。