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

时间:2018-08-22 06:31:51

标签: php asynchronous exception-handling promise reactphp

这是一个带有ReactPHP promise的简单事件循环:

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

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

        return $promise;
    }
]);

在这种情况下,一切正常,服务器返回500,因为已返回了承诺并被拒绝。

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

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;
    }
]);

服务器/循环仍将运行,但连接将被挂起,因为在返回诺言之前发生了语法错误。

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

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

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

2 个答案:

答案 0 :(得分:1)

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

最好的解决方案是不要有任何语法错误。您可以在提交/部署之前使用它来整理所有文件的软件包是:https://github.com/JakubOnderka/PHP-Parallel-Lint

答案 1 :(得分:1)

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

对于其他类型的错误,如果您使用的是PHP 7,则可以使用

catch (Error $e) { ... }

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

如果您想同时捕获错误和异常,则可以使用类似的代码块

catch (Throwable $e) { ... }

如果您只想捕获异常,请使用

catch (Exception $e) { ... }

有关更多信息,请参见http://php.net/manual/en/language.errors.php7.php