返回承诺之前承诺中的语法错误

Syntax error in a promise before the promise is returned

这是一个带有 ReactPHP promise:

的简单事件循环
new React\Http\Server([
    function(ServerRequestInterface $request) {
        $deferred = new React\Promise\Deferred();
        $promise = $deferred->promise();

        $deferred->reject(new Response(500));

        return $promise;
    }
]);

在这种情况下,一切正常,服务器 returns 500,因为承诺 returned 但被拒绝了。

但是如何处理这样的情况:

new React\Http\Server([
    function(ServerRequestInterface $request) {
        $deferred = new React\Promise\Deferred();
        $promise = $deferred->promise();

        SynTaxErrO..2!((r();

        $deferred->reject(new Response(500));

        return $promise;
    }
]);

server/loop 仍将是 运行,但连接将挂起,因为在 returned 之前发生语法错误。

我的第一个假设是使用 try-catch,但它似乎在 PHP 中不起作用。

try {
    SynTaxErrO..2!((r();
} catch($e) {
    $deferred->reject(new Response(500));
    return $promise;
}

有没有办法处理像这样的情况并且仍然 return 500 而不是挂起并等待从未 returned 的承诺?在实际代码中,我有一个 return 承诺的路由器功能。如果其中一条路由有语法错误,则永远不会重新调整承诺,因此连接会挂起。也没有错误消息。

嘿 ReactPHP 团队成员。看起来你问题的罪魁祸首是 SynTaxErrO..2!((r();,PHP 无法解析:https://3v4l.org/02cli

最好的解决办法是不要有任何语法错误。在 committing/deploying 之前可以用来检查所有文件的包是:https://github.com/JakubOnderka/PHP-Parallel-Lint

您无法捕获语法错误。如果在您的 catch 语句之前存在语法错误,那么执行永远不会到达您的 catch,因此就像它不存在一样。要检测语法错误,请在执行代码之前使用 linter(例如,php -l)。

其他类型的错误,如果你使用的是PHP7,那么你可以使用

catch (Error $e) { ... }

set_exception_handler() 捕获错误的处理程序。

如果你想同时捕获错误和异常,那么你可以使用像

这样的块
catch (Throwable $e) { ... }

如果只想捕获异常,使用

catch (Exception $e) { ... }

有关详细信息,请参阅 http://php.net/manual/en/language.errors.php7.php