PHP生成器可以从未捕获的异常中恢复吗?

时间:2018-11-12 20:39:03

标签: php generator

考虑使用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

发电机有办法从中恢复吗?还是生成器中未捕获的异常会“破坏”该生成器的当前实例?

1 个答案:

答案 0 :(得分:1)

当引发异常时,生成器将跳到函数的结尾。如果常规函数调用的东西引发了异常,这就是这种情况。

您的两个选项是:

  1. 将其捕获到生成器中(或最终使用)。
  2. 完全不扔它

抛出异常并将其用作“临时”消息传递系统但恢复正常运行的想法有点怪异。听起来有些滥用例外。也许您想要实现的目标可以在不引发异常的情况下完成。

如果您要对具有多个步骤的操作进行建模,并且每个操作可能分别失败或成功,则一种选择可能是仅产生异常而不抛出异常。