考虑使用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
发电机有办法从中恢复吗?还是生成器中未捕获的异常会“破坏”该生成器的当前实例?
答案 0 :(得分:1)
当引发异常时,生成器将跳到函数的结尾。如果常规函数调用的东西引发了异常,这就是这种情况。
您的两个选项是:
抛出异常并将其用作“临时”消息传递系统但恢复正常运行的想法有点怪异。听起来有些滥用例外。也许您想要实现的目标可以在不引发异常的情况下完成。
如果您要对具有多个步骤的操作进行建模,并且每个操作可能分别失败或成功,则一种选择可能是仅产生异常而不抛出异常。