这是一个带有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,因此连接只是挂起。也没有错误消息。
答案 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) { ... }